Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Если вы используете Java и Jena ARQ, вы можете использовать расширения ARQ для агрегатов. Ваш запрос будет выглядеть примерно так:

SELECT ?tag (count(distinct ?tag) as ?count)
WHERE {
    ?r ns9:taggedWithTag ?tagresource.
    ?tagresource ns9:name ?tag
}
LIMIT 5000

исходная спецификация SPARQL с 2008 г. не включала агрегаты, но текущая версия 1.1, начиная с 2013 года.

Ответ 2

Использование 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) "Изучение SPARQL". OReilly Media, Севастополь, Калифорния, США; см http://www.learningsparql.com/

Чтобы избежать ошибки "Неправильное заполнение" при использовании GROUP BY:

  1. Переменные группировки должны совпадать; (категория в первом примере)
  2. Остальные переменные в SELECT должны приводить к одному значению; (SUM (? Value) как? ValueSum) в первом примере.