Привязка результата агрегатной функции к проецируемой переменной

Я пытаюсь подсчитать количество значений для данного свойства и вывести каждый из полученных ресурсов вместе с этим числом. Я пытаюсь использовать BIND для сохранения значения результата функции COUNT в переменной и проецировать эту переменную на мои результаты. Однако это значение кажется пустым, и я не понимаю, почему это так.

Мой запрос в настоящее время выглядит так:

SELECT DISTINCT ?a ?c
WHERE {
  ?a <http://www.w3.org/2000/01/rdf-schema#label> ?b.
  BIND(COUNT(?b) AS ?c).
}
LIMIT 100

Я думаю, что мне придется сгруппировать по ?a, хотя я еще не уверен, как поступить, если я хочу сделать это для нескольких свойств, но это не касается этого вопроса: сейчас я просто хочу выяснить, почему ?c кажется пустым.

Разве сейчас не должна быть ровно одна метка для каждой результирующей строки? Если да, то почему литерал 1^^xsd:integer не привязан к ?c или, по крайней мере, к некоторому большому числу, представляющему общее (несгруппированное) количество меток (аналогично тому, что произошло здесь) - например, на следующих конечных точках:

Я знаю, что функция, которую я ищу, может не поддерживаться некоторыми или всеми этими реализациями, но если это так, то кажется необычным, что COUNT просто «проглатывается» без сообщения об ошибке (я получил сообщение об ошибке на некоторых других). конечные точки для синтаксиса).

Таким образом, мой вопрос: Почему возвращаемое значение COUNT пусто?

  • Is the COUNT function in that position not recognized by the endpoints?
    • As it seems to be syntactically valid there, is that a shortcoming of current SPARQL engines, or is that by design?
  • Функция COUNT оценивается только позже (и если да, то почему она хотя бы не возвращает что-то вроде 0)?

person O. R. Mapper    schedule 07.01.2014    source источник


Ответы (1)


Ваш запрос на самом деле не является законным. Существует валидатор запросов SPARQL на сайте sparql.org, который сообщает о синтаксической ошибке на count:

Ошибка синтаксиса:

Строка 4, столбец 8: совокупное выражение, недопустимое на данный момент.

Я не могу сказать, почему некоторые двигатели не задыхаются от этого. Число, встроенное в функции SPARQL, может вызывать ошибки, что обычно приводит к привязке переменных к кажущимся пустым результатам. Возможно, некоторые разработчики движка SPARQL пошли еще дальше и заставили вызовы отсутствующих функций возвращать ошибку (которая выглядит как несвязанная переменная). Вероятно, это будет расследование каждого конкретного случая, и вам нужно будет связаться с разработчиками этих продуктов отдельно.

В любом случае вы, вероятно, захотите написать запрос, более или менее похожий на следующий. Вы можете использовать (aggregate-function(args) as variable) в проекционной части запроса, и именно так вы можете привязать количество ?bs на ?a к ?c после того, как вы сгруппировали по ?a.

select distinct ?a (count(?b) as ?c)
where { ?a rdfs:label ?b }
group by ?a
person Joshua Taylor    schedule 07.01.2014
comment
Действительно, это ошибка, которую я получил от других конечных точек, которые я упомянул в своем вопросе. Я думаю, что был слишком самоуверен в этой работе с BIND после прочтения Вам нужно использовать BIND(COUNT(?x) as ?count) или аналогичный синтаксис. здесь и увидев в спецификации SPARQL 1.1, что < href="http://www.w3.org/TR/sparql11-query/#rBuiltInCall" rel="nofollow noreferrer">грамматика, предполагающая использование агрегатных функций в BIND, будет синтаксически допустимой. Я понимаю. Тогда я попытаюсь реструктурировать свои запросы, чтобы они содержали вложенные подзапросы. - person O. R. Mapper; 08.01.2014
comment
@ORMapper Я не понимаю, насколько здесь важны вложенные подзапросы. Они не используются ни в моем решении, ни в вашем исходном запросе. В обсуждении, на которое вы ссылались, говорилось о проблеме, которую вы не можете сделать select count(?x) ..., а должны назвать переменную с помощью select (count(?x) as ?something) .... Некоторые конечные точки делают разрешают первое и генерируют имя, даже если оно не является стандартным. На данный момент он не работает, но я думаю, что конечная точка DBpedia (Virtuoso) сделает это, например. - person Joshua Taylor; 08.01.2014
comment
Мои фактические запросы, а не упрощенные для целей этого вопроса, делают немного больше с результатом COUNT. Проекция была добавлена ​​только для целей отладки; на самом деле я использую значения COUNT в выражениях FILTER, например, для получения свойств с заданным минимальным количеством различных значений. - person O. R. Mapper; 08.01.2014
comment
@ O.R.Mapper Ах, да, тогда вам, вероятно, понадобятся подзапросы. Обратите внимание, что вы можете фильтровать агрегированные значения, используя having. Например, select ?a (count(?b) as ?c) where { ... } group by ?a having (?c > 100). - person Joshua Taylor; 08.01.2014
comment
Спасибо, я наткнулся на HAVING. Не уверен, достаточно ли он гибок для моих целей; Я попробую. - person O. R. Mapper; 08.01.2014
comment
@O.R.Mapper Э-э, ну, я не думаю, что вы можете сделать ...group by ?a having (?c > 100), но вы можете сделать ...group by ?a having (count(?b) > 100). - person Joshua Taylor; 08.01.2014