Consulta Sparql e contagem distinta
Pergunta
Eu tenho a seguinte consulta:
SELECT ?tag WHERE {
?r ns9:taggedWithTag ?tagresource.
?tagresource ns9:name ?tag
}
LIMIT 5000
E os resultados são:
abc
abc
abc
abc
abc
abc
abc
abd
ads
anb
Eu quero fazer algo como:
tag | count
-----------------
abc 7
abd 1
ads 1
anb 1
Eu tentei com count(*)
e count(?tag)
, mas então eu recebo a mensagem de erro "Variable or "*" expected."
Alguém pode me dizer, como fazê -lo certo?
Solução
Se você está usando o ARQ de Java e Jena, você pode usar Extensões da ARQ para agregados. Sua consulta seria algo como:
SELECT ?tag (count(distinct ?tag) as ?count)
WHERE {
?r ns9:taggedWithTag ?tagresource.
?tagresource ns9:name ?tag
}
LIMIT 5000
o Especificação SPARQL original de 2008 não incluía agregados, mas A versão atual, 1.1, de 2013 faz.
Outras dicas
Usando count (), min (), max (), sum (), avg () com grupo por pode produzir valores resumidos para grupos de triplos. Observe que esses padrões podem ser específicos para o SPARQL 1.1.
Por exemplo, este pode somar o valor?
SELECT ?category (SUM(?value) as ?valueSum)
WHERE
{
?s ?category ?value .
}
GROUP BY ?category
Este pode contar o número de usos para o predicado? P,
SELECT ?p (COUNT(?p) as ?pCount)
WHERE
{
?s ?p ?o .
}
GROUP BY ?p
Esses exemplos são inspirados no material de Bob Ducharme (2011), "Learning Sparql". O'Reilly Media, Sebastopol, CA, EUA; Vejo http://www.learningsparql.com/