Один четырехъядерник + самый простой запрос SPARQL = 1 результат в Jena, 2 результата в Sesame — кто прав?

Добавьте только этот четырехугольник в пустой магазин:

<http://x.com/s> <http://x.com/p> 2 <http://x.com/g> .

Затем выполните этот SPARQL-запрос (взято из книги Боба Дюшарма «Изучение 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 — готово к работе, никаких изменений в конфигурации!): Просто использовал функцию «Добавить» в workbench, чтобы вручную добавить указанный выше четырехъядерный процессор (с выбранным «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", и поэтому разные реализации могут возвращать разные результаты) - любое просветление было бы очень добро пожаловать :) !


person Pat McBennett    schedule 21.08.2013    source источник
comment
Левая часть ваших UNION запросов к графику по умолчанию. Я подозреваю, что разница возникает из-за того, что содержится в графе по умолчанию в этих двух системах. Например, возможно, в Jena граф по умолчанию пуст, если не добавлены триплеты, а в Sesame граф по умолчанию представляет собой объединение именованных графов?   -  person Joshua Taylor    schedule 22.08.2013


Ответы (1)


Как указывает @Joshua Taylor в своем комментарии, причина в том, что Sesame и Jena используют другую интерпретацию графика по умолчанию.

В Sesame графом по умолчанию считается весь репозиторий: все операторы во всех именованных графах, а также все операторы без именованного графа. Следовательно, первый аргумент вашего объединения, который запрашивает граф по умолчанию, завершается успешно и связывает ?s, ?p и ?o (но не ?g). Второй аргумент вашего объединения, очевидно, также успешен, потому что исходный четырехугольник, конечно же, находится в именованном графе, и поэтому вы получаете два ответа.

Jena по умолчанию использует «исключительный» граф по умолчанию: в графе по умолчанию находятся только операторы, которые явно не добавлены к какому-либо конкретному именованному графу. Таким образом, в Йене первая часть вашего объединения завершается неудачно (нет соответствующих операторов в графе по умолчанию в Йене), вторая часть завершается успешно, и поэтому вы получаете только 1 результат.

Как ни странно, оба варианта верны. Разница заключается просто в том, как настроен набор данных, на котором выполняется запрос.

Конечно, есть способы справиться с этим. Как в Jena, так и в Sesame вы можете добавить предложения FROM (NAMED), чтобы указать, что представляет собой запрошенный набор данных (Sesame предлагает имя графа sesame:nil для явного запроса тех утверждений, которые не связаны с именованным графом). Кроме того, вы можете программно изменить определение набора данных, для которого выполняется запрос. Точные механизмы в Jena и Sesame немного отличаются, но они оба имеют возможность (в Sesame вы можете создать и предоставить объект Dataset с вашим запросом перед выполнением, в Jena, я полагаю, вы можете перенастроить фактическое хранилище или модель, на которой вы выполняете запрос, чтобы вести себя по-другому).

person Jeen Broekstra    schedule 21.08.2013
comment
После публикации предыдущего комментария я изучил способы получения графов по умолчанию и объединений в Йене. Документация описывает два специальных графика, urn:x-arq:UnionGraph и urn:x-arq:DefaultGraph. - person Joshua Taylor; 22.08.2013
comment
Я не должен быть в запросе: если вы устанавливаете через контекст TDB.getContext().set(TDB.symUnionDefaultGraph, true) ; тогда граф запроса по умолчанию представляет собой объединение именованных графов. См. jena.apache.org/documentation/tdb/datasets.html. - person AndyS; 22.08.2013