SPARQL-запрос с COUNT и ORDER возвращает нечетный результат - PullRequest
5 голосов
/ 01 апреля 2011

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

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

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

http://dbpedia.org/sparql?default-graph-uri=http://dbpedia.org&query=select+count(*)+{+%3Fs+%3Fp+%3Chttp://dbpedia.org/resource/Cat%3E+}+&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+count(*)+{+%3Fs+%3Fp+%3Chttp://dbpedia.org/resource/Cat%3E+}+order+by+%3Fs&debug=on&timeout=&format=text/html&save=display&fname=

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

Ответы [ 3 ]

5 голосов
/ 02 апреля 2011

Это похоже на ошибку, если вы выполняете запросы одного и того же типа в другом хранилище, то есть в 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 не выбран для извлечения.Но, как вы сказали, вы попробовали это случайно и ... это похоже на ошибку.

Я рекомендую отправить электронное письмо в список рассылки virtuoso-user для уведомления об этой проблеме.

3 голосов
/ 03 апреля 2011

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

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

2 голосов
/ 02 апреля 2011

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

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

...