tbloader vs SPARQL INSERT - 为什么命名图表的行为不同?

时间:2013-09-19 10:00:23

标签: sparql jena tdb arq named-graphs

在ARQ,TDB和命名图的命令行工具的连接中存在奇怪的行为。如果通过命名图中的tdbloader导入数据,则无法通过SPARQL SELECT查询中的GRAPH子句进行查询。但是,使用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导入的数据丢失了?这个查询有什么问题?如何从两个导入中获得结果?

1 个答案:

答案 0 :(得分:8)

尝试此查询:

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> |
----------------------------------------------------------------------------------------------------------------