tbloader vs SPARQL INSERT - Почему разное поведение с именованными графами?

Странное поведение при подключении инструментов командной строки ARQ, TDB и Named Graphs. При импорте данных через tdbloader в именованный граф их нельзя запросить с помощью предложения GRAPH в запросе SPARQL SELECT. Однако этот запрос возможен при вставке данных в один и тот же граф с помощью SPARQL INSERT.

У меня есть следующий файл описания ассемблера tdb.ttl:

@prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ja:     <http://jena.hpl.hp.com/2005/11/Assembler#> .
@prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .


[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
tdb:GraphTDB    rdfs:subClassOf  ja:Model .

[] rdf:type         tdb:DatasetTDB ;
    tdb:location "DB" ;
.

В файле data.ttl есть набор данных:

<a> <b> <c>.

Теперь я вставляю эти данные с помощью tdbloader и, во-вторых, еще одну тройку с помощью SPARQL INSERT, оба в названном графике data:

tdbloader --desc tdb.ttl --graph data data.ttl
update --desc tdb.ttl "INSERT DATA {GRAPH <data> {<d> <e> <f>.}}"

Теперь данные можно запрашивать с помощью SPARQL через:

$arq --desc tdb.ttl "SELECT *  WHERE{ GRAPH ?g {?s ?p ?o.}}"
----------------------------
| s   | p   | o   | g      |
============================
| <a> | <b> | <c> | <data> |
| <d> | <e> | <f> | <data> |
----------------------------

Все кажется идеальным. Но теперь я хочу запросить только этот конкретный объект с именем graph data:

$ arq --desc tdb.ttl "SELECT *  WHERE{ GRAPH <data> {?s ?p ?o.}}"
-------------------
| s   | p   | o   |
===================
| <d> | <e> | <f> |
-------------------

Почему отсутствуют данные, импортированные из tdbloader? Что не так с этим запросом? Как я могу получить результаты от обоих операций импорта?


person mgraube    schedule 19.09.2013    source источник
comment
Я не знаю, почему это происходит, но спасибо за очень хорошо продуманный вопрос с минимальным рабочим примером, который мы можем использовать для воспроизведения проблемы!   -  person Joshua Taylor    schedule 19.09.2013
comment
Еще три интересных результата см. На странице pastebin.com/3cT4fagi. Короче говоря, SELECT * WHERE { values ?g { <data> } graph ?g { ?s ?p ?o }} возвращает только одно значение, но SELECT * WHERE { values ?s { <a> <d> } graph ?g { ?s ?p ?o }} возвращает два, а SELECT * WHERE { values ?g { <data> UNDEF } graph ?g { ?s ?p ?o }} возвращает три (есть повторяющийся результат).   -  person Joshua Taylor    schedule 19.09.2013
comment
Интересно, что если вы используете абсолютный URI вместо относительного, как я показал в pastebin.com/ViWmNmWT, вы получите желаемый результат.   -  person Joshua Taylor    schedule 19.09.2013
comment
Интересно, происходит ли здесь то, что относительные URI в tdbloader --desc tdb.ttl --graph data data.ttl и update --desc tdb.ttl "INSERT DATA {GRAPH <data> {<d> <e> <f>.}}" решаются по-разному, так что вы получаете два разных URI, которые напечатаны одинаково в этих результатах.   -  person Joshua Taylor    schedule 19.09.2013
comment
Да - спасибо за полный, минимальный пример. Я потратил на это больше времени, чем мог бы в противном случае.   -  person AndyS    schedule 19.09.2013


Ответы (1)


Попробуйте этот запрос:

PREFIX : <data>
SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }

и выход

----------------------------
| s   | p   | o   | g      |
============================
| <a> | <b> | <c> | <data> |
| <d> | <e> | <f> | :      |
----------------------------

или попробуйте:

 tdbquery --loc DB --file Q.rq -results srj

чтобы получить результаты в ином виде.

Текстовый вывод выглядит красиво, но две разные вещи заканчиваются как <data>.

Вы видите, что

tdbloader --desc tdb.ttl --graph data data.ttl

использовал data точно так же, как и назвал график. Но

INSERT DATA {GRAPH <data> {<d> <e> <f>.}}

выполняет полный синтаксический анализ SPARQL и разрешает базовый URI, вероятно, похожий на file://*currentdirectory*.

При печати в тексте URI сокращаются, в том числе с использованием базы. Таким образом, как исходный data (из tdbloader), так и file:///path/data отображаются как <data>.

PREFIX : <data>

дает текстовый вывод по-другому, чтобы записать его как :.

Наконец попробуйте:

BASE <http://example/>
SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }

который устанавливает базовый URI на что-то не рядом с вашими URI данных, поэтому отключите хорошее форматирование с помощью базового URI:

----------------------------------------------------------------------------------------------------------------
| s                        | p                        | o                        | g                           |
================================================================================================================
| <file:///home/afs/tmp/a> | <file:///home/afs/tmp/b> | <file:///home/afs/tmp/c> | <data>                      |
| <file:///home/afs/tmp/d> | <file:///home/afs/tmp/e> | <file:///home/afs/tmp/f> | <file:///home/afs/tmp/data> |
----------------------------------------------------------------------------------------------------------------
person AndyS    schedule 19.09.2013
comment
Спасибо за подробное объяснение этой проблемы. Тогда я буду использовать абсолютные URI. Тогда СОЮЗ не нужен. - person mgraube; 19.09.2013