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, оба в именованные графические данные:
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> |
----------------------------
Все кажется идеальным. Но теперь я хочу запросить только эти специфические данные графа:
$ arq --desc tdb.ttl "SELECT * WHERE{ GRAPH <data> {?s ?p ?o.}}"
-------------------
| s | p | o |
===================
| <d> | <e> | <f> |
-------------------
Почему отсутствуют данные, импортированные из tdbloader? Что не так с этим запросом? Как я могу получить результаты обоих импортов?
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
чтобы получить результаты в другой форме.
Вывод текста: makign выглядит хорошо, но две разные вещи заканчиваются как <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> |
----------------------------------------------------------------------------------------------------------------