2012-05-03 13 views
8

Biorąc to bardzo prosty model:Jak zrobić COUNT w SPARQL

@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 . 

Próbuję uzyskać listę elementów i liczbę tagów że każdy ma:

item tagCount 
===== ======== 
item1 1 
item2 2 
item3 3 

Tutaj jest mój kwerendy:

SELECT ?item (count(?tag) as ?tagcount) 
WHERE { 
    ?item :tag ?tag 
} 

jednak wraca:

item tagCount 
===== ======== 
     6 

Z tego, co przeczytałem, powinno to zadziałać. Używam Jena 2.6.4

+1

'COUNT' nie jest częścią specyfikacji SPARQL 1.0, zostało dodane w 1.1. Niektóre implementacje mimo to ją wspierają. Tylko mówię. –

+0

Wzniesiono ponownie dla jasno wyrażonego pytania i właściwego formatowania! – cygri

Odpowiedz

6

Nie próbowałem tego, ale spróbuj dodać GROUP BY ?item do końca kwerendy. Myślę, że bez numeru GROUP BY liczy się tylko całkowita liczba wierszy.

+0

Tak, zlicza całkowitą liczbę wierszy. Dokładnie to samo, co SQL w tym przypadku. Jednak nie wiem, co dzieje się z '? Item'. –

3

za wiązanie się pojawiać w wynikach trzeba zrobić, aby skorzystać z grupy według słów kluczowych tak, to staje

wybrać pozycję (count (tag) jak tagcount?) gdzie { produktu:? Tag? tag } grupa o? poz

Jeśli chcesz policzyć coś w środku zapytania byłoby wykonać następujące czynności, trzeba pamiętać, w jaki sposób należy umieścić wewnętrzną kwerendę wybierającą do własnego bloku {}

SELECT * { 
    ?item a owl:Thing . 

    { 
     SELECT ?item (count(?tag) as ?tagcount) 
     WHERE { 
      ?item :tag ?tag 
     } group by ?item 
    } 
} 
0

sub-select @ user2316243 jest niepotrzebny, dlatego następujące zapytanie jest równoważne:

SELECT ?item (count(?tag) as ?tagcount) 
WHERE { 
    ?item a owl:Thing . 
    ?item :tag ?tag . 
} GROUP BY ?item