Запрос SPARQL с COUNT и ORDER возвращает нечетный результат

Следующий запрос подсчитывает все тройки в магазине.

SELECT count(*) where { ?s ?p <http://dbpedia.org/resource/Cat> }

И возвращает ожидаемые результаты

http://dbpedia.org/sparql?default-graph-uri=http://dbpedia.org&query=select%20count%28%2a%29%20%7B%20?s%20?p%20%3Chttp://dbpedia.org/resource/Cat%3E%20%7D%20&debug=on&timeout=&format=text/html&save=display&fname=

Однако, когда я впервые попробовал это, я случайно оставил оператор ORDER BY, например,

select count(*) { ?s ?p <http://dbpedia.org/resource/Cat> } order by ?s

Потом я получаю очень длинный список результатов

http://dbpedia.org/sparql?default-graph-uri=http://dbpedia.org&query=select%20count%28%2a%29%20%7B%20?s%20?p%20%3Chttp://dbpedia.org/resource/Cat%3E%20%7D%20order%20by%20?S&debug=on&timeout=&format=text/html&save=display&fname=

Может ли кто-нибудь объяснить, почему происходит такой результат и что он означает? Может быть, это ошибка в реализации Virtuoso SPARQL?


person John McCrae    schedule 01.04.2011    source источник
comment
подумайте о том, чтобы спросить на semanticoverflow.com   -  person harschware    schedule 02.04.2011
comment
Хорошо, похоже, это ошибка Virtuoso, спасибо за вашу помощь   -  person John McCrae    schedule 03.04.2011


Ответы (3)


Это действительно похоже на ошибку, если вы запустите тот же тип запросов в другом магазине, то есть на http://api.talis.com/stores/bbc-backstage/services/sparql (который не работает виртуозно)

Этот первый запрос работает ...

SELECT (count(?s) as ?c)
WHERE {
?s ?p <http://purl.org/ontology/po/Version> .
}

а второй ...

SELECT (count(?s) as ?c)
WHERE {
?s ?p <http://purl.org/ontology/po/Version> .
} order by ?s

... дает тот же результат.

На самом деле подсчет + упорядочивание здесь не имеет большого смысла, потому что ?s не выбран для извлечения. Но, как вы сказали, вы попробовали это случайно, и ... это действительно похоже на ошибку.

Я рекомендую отправить электронное письмо в список рассылки виртуозных пользователей, чтобы уведомить об этой проблеме.

person Manuel Salvadores    schedule 02.04.2011

У нас (= OpenLink) проблемы. Этот ORDER BY? S формально является ошибкой в ​​запросе: агрегирование без группировки означает «агрегирование по всему», не должно быть переменных вне агрегатов на выходе запроса. Однако сейчас об этой ошибке не сообщается: нарушения этого правила настолько многочисленны, что компилятор SQL выполняет автоматическую группировку, а наш препроцессор SPARQL-to-SQL также игнорирует эту ошибку, если это возможно.

Мы, вероятно, сохраним текущее поведение как есть. Если добавлен «строгий» режим компиляции, в таких случаях будет срабатывать отчет об ошибке.

person Ivan Mikhailov    schedule 03.04.2011

Это может быть ошибка Virtuoso, похоже, что запросы с агрегатами и предложением ORDER BY обрабатываются как неявные предложения GROUP BY. Я заметил это на других конечных точках Virtuoso, кроме DBPedia.

ИМО, это ошибка, и вы должны сообщить об этом в список рассылки пользователей Virutoso, как предлагает msalvadores.

person RobV    schedule 02.04.2011