web-dev-qa-db-fra.com

Requête SPARQL et nombre distinct

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?

29
cupakob

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.

37
Phil M

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 :

  1. Les variables de regroupement doivent correspondre; (? catégorie dans le premier exemple)
  2. Les autres variables du SELECT doivent chacune résulter en une seule valeur; (SUM (? Value) as? ValueSum) dans le premier exemple.
30
Darren Weber