J'ai la requête suivante:
SELECT ?tag WHERE {
?r ns9:taggedWithTag ?tagresource.
?tagresource ns9:name ?tag
}
LIMIT 5000
et les résultats sont:
abc
abc
abc
abc
abc
abc
abc
abd
ads
anb
Je veux obtenir quelque chose comme:
tag | count
-----------------
abc 7
abd 1
ads 1
anb 1
Je l'ai essayé avec count(*)
et count(?tag)
, mais je reçois le message d'erreur "Variable or "*" expected."
Quelqu'un peut-il me dire comment faire les choses correctement?
Si vous utilisez Java et l'ARQ de Jena, vous pouvez utiliser les extensions ARQ pour les agrégats . Votre requête ressemblerait à quelque chose comme:
SELECT ?tag (count(distinct ?tag) as ?count)
WHERE {
?r ns9:taggedWithTag ?tagresource.
?tagresource ns9:name ?tag
}
LIMIT 5000
La spécification SPARQL originale de 2008 n'incluait pas d'agrégats, mais la version actuelle, 1.1, à partir de 201 le fait.
L'utilisation de COUNT (), MIN (), MAX (), SUM (), AVG () avec GROUP BY peut produire des valeurs récapitulatives pour des groupes de triplets. Remarque, ces modèles peuvent être spécifiques à SPARQL 1.1.
Par exemple, celui-ci peut additionner la "valeur pour chaque" catégorie,
SELECT ?category (SUM(?value) as ?valueSum)
WHERE
{
?s ?category ?value .
}
GROUP BY ?category
Celui-ci peut compter le nombre d'utilisations pour le prédicat? P,
SELECT ?p (COUNT(?p) as ?pCount)
WHERE
{
?s ?p ?o .
}
GROUP BY ?p
Ces exemples sont inspirés du matériel de Bob DuCharme (2011), "Learning SPARQL". O’Reilly Media, Sebastopol, Californie, États-Unis; voir http://www.learningsparql.com/
Pour éviter l'erreur "Mauvais agrégat" lors de l'utilisation de GROUP BY :