2009-08-03 12 views
27

Ich habe die folgende Abfrage:SPARQL Query und Distinct Count

SELECT ?tag WHERE { 
    ?r ns9:taggedWithTag ?tagresource. 
    ?tagresource ns9:name ?tag 
} 
LIMIT 5000 

und die Ergebnisse sind:

abc 
abc 
abc 
abc 
abc 
abc 
abc 
abd 
ads 
anb 

Ich möchte somthing erhalten wie:

tag | count 
----------------- 
abc  7 
abd  1 
ads  1 
anb  1 

I habe es mit count(*) und count(?tag) versucht, aber als ich th e Fehlermeldung "Variable or "*" expected." Kann mir jemand sagen, wie man es richtig macht?

+0

Core SPARQL verfügt nicht über Aggregate wie COUNT. Mit welcher SPARQL-Erweiterung arbeiten Sie? – laalto

+0

Ich denke, ich benutze den Kern :( – cupakob

+0

@ laalto Nur wie ein Hinweis, die neueste Version von SPARQL, Version 1.1, von 2013, * enthält * Aggregate. –

Antwort

32

Wenn Sie Java und Jena ARQ verwenden, können Sie ARQ's extensions for aggregates verwenden. Ihre Abfrage würde in etwa so aussehen:

SELECT ?tag (count(distinct ?tag) as ?count) 
WHERE { 
    ?r ns9:taggedWithTag ?tagresource. 
    ?tagresource ns9:name ?tag 
} 
LIMIT 5000 

Die original SPARQL specification from 2008 nicht Aggregate umfassen, aber the current version, 1.1, from 2013 tut.

+5

es nicht, aber Aggregate werden SPARQL hinzugefügt 1.1 und sie sind weit verbreitet (über verschiedene Erweiterungen, wie angegeben) – dajobe

25

Mit COUNT(), MIN(), MAX(), SUM(), AVG() mit GROUP BY können zusammenfassende Werte für Gruppen von Tripeln erstellt werden. Beachten Sie, dass diese Muster möglicherweise für SPARQL 1.1 spezifisch sind.

Zum Beispiel kann dies eine Summe der? Wert für jeden? Kategorie,

SELECT ?category (SUM(?value) as ?valueSum) 
WHERE 
{ 
    ?s ?category ?value . 
} 
GROUP BY ?category 

Dieses man die Anzahl der Verwendungen für Prädikat zählen kann? P,

SELECT ?p (COUNT(?p) as ?pCount) 
WHERE 
{ 
    ?s ?p ?o . 
} 
GROUP BY ?p 

Diese Beispiele sind inspiriert von Bob DuCharme (2011), "Learning SPARQL". O'Reilly Media, Sebastopol, Kalifornien, USA; siehe http://www.learningsparql.com/