SPARQL Query und Distinct Count
Frage
Ich habe die folgende Abfrage:
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
Ich habe es versucht, mit count(*)
und count(?tag)
, aber als ich die Fehlermeldung "Variable or "*" expected."
bekommen Kann mir jemand sagen, wie man es richtig machen?
Lösung
Wenn Sie mit Java und Jena ARQ, können Sie ARQ die Erweiterungen für Aggregate . 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-Spezifikation von 2008 keine Aggregate enthalten waren, aber der aktuellen Version 1.1, ab 2013 der Fall ist.
Andere Tipps
Mit COUNT (), MIN (), MAX (), SUM (), AVG () mit GROUP BY können Summenwerte für Gruppen von Tripel produzieren. Beachten Sie, könnten diese Muster spezifisch für SPARQL 1.1.
Zum Beispiel kann dies eine Summe der? Wertes für jeden? Kategorie,
SELECT ?category (SUM(?value) as ?valueSum)
WHERE
{
?s ?category ?value .
}
GROUP BY ?category
Dies kann die Anzahl der Verwendungen für Prädikat zählen? P,
SELECT ?p (COUNT(?p) as ?pCount)
WHERE
{
?s ?p ?o .
}
GROUP BY ?p
Diese Beispiele von Material von Bob Ducharme (2011), "Lernen SPARQL" inspiriert. O'Reilly Media, Sebastopol, CA, USA; finden Sie unter http://www.learningsparql.com/