Kevin Pauli
Kevin Pauli

Reputation: 8885

How to do a COUNT in SPARQL

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

Answers (3)

scotthenninger
scotthenninger

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

user2316243
user2316243

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

cygri
cygri

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

Related Questions