SPARQL-запрос и отчетливый счет - PullRequest
29 голосов
/ 03 августа 2009

У меня следующий запрос:

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), но чем я получаю сообщение об ошибке "Variable or "*" expected." Может кто-нибудь сказать мне, как сделать это правильно?

Ответы [ 2 ]

37 голосов
/ 03 августа 2009

Если вы используете 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 года не содержит.

30 голосов
/ 18 апреля 2012

С помощью 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/

...