[ 
https://issues.apache.org/jira/browse/JENA-766?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14106623#comment-14106623
 ] 

Andy Seaborne commented on JENA-766:
------------------------------------

The results look right to me.  Consider this query:

{noformat:title=Example 2}
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
 SELECT ?resource 
        (COUNT (DISTINCT ?c) as ?c_count) 
        (COUNT (DISTINCT ?resource) as ?r_count) 
WHERE {
        ?resource rdf:type/rdfs:subClassOf* 
<http://example.com/ns#CardExact3Class>.
        ?resource <http://example.com/ns#cardExact3> ?c.
} GROUP BY ?resource
HAVING ( ( count(?c)  != 3 ) && ( count(?c)  != 0 ) )
{noformat}

which has results (run with arq.sparql --data ... --query ...).

{noformat:title=Results 2}
-------------------------------------------------------
| resource                        | c_count | r_count |
=======================================================
| <http://example.com/ns#error3a> | 2       | 1       |
| <http://example.com/ns#error3b> | 4       | 1       |
-------------------------------------------------------
{noformat}

In your query, {{(COUNT (DISTINCT ?resource)}} is counting the number 
of distinct occurences of {{?resource}} in each group.  Because the query has 
{{GROUP BY ?resource}}, in each group there is exactly one value of 
{{?resource}}.
This gives {{?r_count}}.

{{?c_count}} aligns with the {{HAVING}} clause usage.

{{DISTINCT}} inside an aggregate applies to the expression of the aggregate
over the group.  {{SELECT DISTINCT}} applies to the rows of the result set.


> Aggregate query returns (possibly) wrong results
> ------------------------------------------------
>
>                 Key: JENA-766
>                 URL: https://issues.apache.org/jira/browse/JENA-766
>             Project: Apache Jena
>          Issue Type: Bug
>          Components: Jena
>    Affects Versions: Jena 2.11.2
>         Environment: Ubuntu 14.04
>            Reporter: Dimitris Kontokostas
>            Priority: Minor
>
> I have the following query
> {code:title=SPARQL-Query}
> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
>  SELECT (COUNT (DISTINCT ?resource) as ?total) WHERE {
>       ?resource rdf:type/rdfs:subClassOf* 
> <http://example.com/ns#CardExact3Class>.
>       ?resource <http://example.com/ns#cardExact3> ?c.
> } GROUP BY ?resource
> HAVING ( ( count(?c)  != 3 ) && ( count(?c)  != 0 ) )
> {code}
> run against the following data
> {code:title=TTL-Data}
> @prefix ex: <http://example.com/ns#> .
> ex:error3a a ex:CardExact3Class ; # 1 error
>       ex:cardExact3 ex:abc1 ;
>       ex:cardExact3 ex:abc2 .
> ex:error3b a ex:CardExact3Class ; # 1 error
>       ex:cardExact3 ex:abc1 ;
>       ex:cardExact3 ex:abc2 ;
>       ex:cardExact3 ex:abc3 ;
>       ex:cardExact3 ex:abc4 .
> {code}
> The query should return 2 as result but instead returns 1.
> If I change the query type to SELECT DISTINCT ?resource I get 2 results so I 
> think this should be a Jena issue (but maybe I miss something again)
> Here's some sample Java code to reproduce
> {code:title=Java code to reproduce}
>         Model model = ModelFactory.createDefaultModel();
>         String Query =
>                 "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n" +
>                 "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
> \n" +
>                 "SELECT (COUNT (DISTINCT ?resource) as ?total) WHERE {\n" +
>                 "\t?resource rdf:type/rdfs:subClassOf* 
> <http://example.com/ns#CardExact3Class>.\n" +
>                 "\t?resource <http://example.com/ns#cardExact3> ?c.\n" +
>                 "} GROUP BY ?resource\n" +
>                 "HAVING ( ( count(?c)  != 3 ) && ( count(?c)  != 0 ) )\n" +
>                 "\n" +
>                 "  ";
>         String data =
>                 "@prefix ex: <http://example.com/ns#> .\n\n" +
>                 "ex:error3a a ex:CardExact3Class ; # 1 error\n" +
>                 "\tex:cardExact3 ex:abc1 ;\n" +
>                 "\tex:cardExact3 ex:abc2 ;\n" +
>                 "\t.\n" +
>                 "ex:error3b a ex:CardExact3Class ; # 1 error\n" +
>                 "   \tex:cardExact3 ex:abc1 ;\n" +
>                 "   \tex:cardExact3 ex:abc2 ;\n" +
>                 "   \tex:cardExact3 ex:abc3 ;\n" +
>                 "   \tex:cardExact3 ex:abc4 ;\n" +
>                 "   \t.\n";
>         model.read(new ByteArrayInputStream( data.getBytes() ), null, "TTL");
>         QueryExecution qe = 
> com.hp.hpl.jena.query.QueryExecutionFactory.create(Query, model);
>         ResultSet results = qe.execSelect();
>         if (results.hasNext()) {
>             QuerySolution qs = results.next();
>             int total = qs.get("total").asLiteral().getInt();
>             // Total should be 2 while it is 1
>         }
> {code}



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to