Одиночная четверка + самый простой запрос SPARQL = 1 результат в Йене, 2 результата в Сезаме - кто прав?
Добавьте только этот четырехугольник в пустой магазин:
<http://x.com/s> <http://x.com/p> 2 <http://x.com/g> .
Затем выполните этот запрос SPARQL (взят из книги Боба Дучарма "Learning SPARQL", так что это должен быть стандартный SPARQL для получения всех четырехугольников в наборе данных, независимо от реализации, верно!?):
SELECT ?g ?s ?p ?o
WHERE {
{ ?s ?p ?o }
UNION
{ GRAPH ?g { ?s ?p ?o } } }
Но Джена и Сезам отвечают разными ответами!! Вот что я вижу:
Консоль Jena Fuseki на Tomcat 6.0.37 (версия 2.10.0 - из коробки, без изменений конфигурации!) - (правильный ответ, насколько я понимаю):
--------------------------------------------------------------
| g | s | p | o |
==============================================================
| <http://x.com/g> | <http://x.com/s> | <http://x.com/p> | 2 |
--------------------------------------------------------------
Sesame Workbench на Tomcat 6.0.37 (версия 2.7.3 - из коробки, без изменений конфигурации!): Просто использовали функцию "Добавить" в рабочей среде, чтобы вручную добавить вышеуказанный квад (с выбранным "N-Quad") в раскрывающемся списке "Формат данных"), в поле "Введите данные RDF, которые вы хотите загрузить", затем запустите приведенный выше запрос:
--------------------------------------------------------------
| g | s | p | o |
==============================================================
| | <http://x.com/s> | <http://x.com/p> | 2 |
| <http://x.com/g> | <http://x.com/s> | <http://x.com/p> | 2 |
--------------------------------------------------------------
Так что это немного пугает тех, кто начинает смотреть на RDF - чего мне здесь не хватает? Я полагаю, что "Сезам" не может быть "неправильным", поэтому, я полагаю, это должна быть моя "интерпретация" (или запрос Боба не "стандартный SPARQL", и поэтому разные реализации могут возвращать разные результаты) - любое просвещение было бы очень добро пожаловать:)!
1 ответ
Как отмечает @Joshua Taylor в своем комментарии, причина в том, что Сезам и Йена используют разные интерпретации графа по умолчанию.
В Сезаме весь репозиторий считается графом по умолчанию: все операторы во всех именованных графах, а также все операторы без именованного графа. Следовательно, первый аргумент вашего объединения, который запрашивает график по умолчанию, завершается успешно и связывается ?s
, ?p
а также ?o
(но нет ?g
). Второй аргумент вашего объединения, очевидно, также успешен, потому что исходный четырехугольник, конечно, находится в именованном графе, и поэтому вы получите два ответа.
Jena по умолчанию использует "эксклюзивный" граф по умолчанию: только графы, которые явно не добавлены в какой-либо конкретный именованный граф, находятся в графе по умолчанию. Следовательно, в Jena первая часть вашего объединения завершается неудачно (на графике по умолчанию Jena нет соответствующих операторов), вторая часть завершается успешно, и поэтому вы получаете только 1 результат.
Как бы странно это ни звучало, оба верны. Разница заключается лишь в том, как настроен набор данных, по которому выполняется запрос.
Конечно, есть способы справиться с этим. И в Йене, и в Сезаме вы можете добавить FROM (NAMED)
пункты, чтобы сделать его явным, что такое запрашиваемый набор данных (Сезам предлагает sesame:nil
имя графа, чтобы явно запросить те операторы, с которыми не связан именованный граф). Кроме того, вы можете программно изменить определение набора данных, по которому выполняется запрос. Точные механизмы в Йене и Сезаме немного отличаются, но у них обоих есть опция (в Сезаме вы можете создать и предоставить Dataset
Я полагаю, что вы можете перенастроить реальное хранилище или модель, в которой вы выполняете запрос, по-другому).