Reputation: 8885
Given this very simple model:
@prefix : <http://example.org/tags#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
:tag rdf:type rdf:Property .
:item1
rdf:type owl:Thing ;
:tag "a"^^xsd:string .
:item2
rdf:type owl:Thing ;
:tag "a"^^xsd:string , "b"^^xsd:string .
:item3
rdf:type owl:Thing ;
:tag "a"^^xsd:string , "b"^^xsd:string , "c"^^xsd:string .
I am trying to get a list of the items and the count of tags that each has:
item tagCount
===== ========
item1 1
item2 2
item3 3
Here is my query:
SELECT ?item (count(?tag) as ?tagcount)
WHERE {
?item :tag ?tag
}
However it is returning:
item tagCount
===== ========
6
From what I have read, this should work. I am using Jena 2.6.4
Upvotes: 10
Views: 12237
Reputation: 4001
The sub-select by @user2316243 is unnecessary, therefore the following query is equivalent:
SELECT ?item (count(?tag) as ?tagcount)
WHERE {
?item a owl:Thing .
?item :tag ?tag .
} GROUP BY ?item
Upvotes: 0
Reputation: 101
For the binding to appear in the results you do need to use the group by keyword so this becomes
SELECT ?item (count(?tag) as ?tagcount) WHERE { ?item :tag ?tag } group by ?item
If you want to count something in the middle of the query you would do the following, note how you must put the inner select query into its own block {}
SELECT * {
?item a owl:Thing .
{
SELECT ?item (count(?tag) as ?tagcount)
WHERE {
?item :tag ?tag
} group by ?item
}
}
Upvotes: 4
Reputation: 9472
I haven't tried this, but try adding GROUP BY ?item
to the end of the query. I think without GROUP BY
it just counts the total number of rows.
Upvotes: 7