SPARQL-запрос и отчетливый счет
Вопрос
У меня следующий запрос:
SELECT ?tag WHERE {
?r ns9:taggedWithTag ?tagresource.
?tagresource ns9:name ?tag
}
LIMIT 5000
и результаты:
abc
abc
abc
abc
abc
abc
abc
abd
ads
anb
Я хочу получить что-то вроде:
tag | count
-----------------
abc 7
abd 1
ads 1
anb 1
Я пробовал его с count (*)
и count (? tag)
, но затем я получаю сообщение об ошибке " Переменная или " * & Quot; ожидается.
Может кто-нибудь сказать мне, как это сделать правильно?
Решение
Если вы используете Java и ARQ от Jena, вы можете использовать расширения ARQ для агрегатов а>. Ваш запрос будет выглядеть примерно так:
SELECT ?tag (count(distinct ?tag) as ?count)
WHERE {
?r ns9:taggedWithTag ?tagresource.
?tagresource ns9:name ?tag
}
LIMIT 5000
оригинальная спецификация SPARQL 2008 года не содержала агрегатов, но текущая версия 1.1 от 2013 года делает.
Другие советы
Использование COUNT (), MIN (), MAX (), SUM (), AVG () с GROUP BY позволяет получить итоговые значения для групп троек. Обратите внимание, что эти шаблоны могут быть специфичными для SPARQL 1.1.
Например, этот может суммировать значение? для каждой категории?
SELECT ?category (SUM(?value) as ?valueSum)
WHERE
{
?s ?category ?value .
}
GROUP BY ?category
Здесь можно сосчитать количество использований предиката? p,
SELECT ?p (COUNT(?p) as ?pCount)
WHERE
{
?s ?p ?o .
}
GROUP BY ?p
Эти примеры основаны на материалах Bob DuCharme (2011), "Learning SPARQL". O'Reilly Media, Севастополь, Калифорния, США; см. http://www.learningsparql.com/