mgr*_*ube 5 sparql jena arq tdb 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" ;
.
Run Code Online (Sandbox Code Playgroud)
data.ttl文件中有一个数据集:
<a> <b> <c>.
Run Code Online (Sandbox Code Playgroud)
现在,我使用tdbloader插入此数据,然后使用SPARQL INSERT插入另一个三元组,两者都在命名图数据中:
tdbloader --desc tdb.ttl --graph data data.ttl
update --desc tdb.ttl "INSERT DATA {GRAPH <data> {<d> <e> <f>.}}"
Run Code Online (Sandbox Code Playgroud)
现在,可以使用SPARQL通过以下方式查询数据:
$arq --desc tdb.ttl "SELECT * WHERE{ GRAPH ?g {?s ?p ?o.}}"
----------------------------
| s | p | o | g |
============================
| <a> | <b> | <c> | <data> |
| <d> | <e> | <f> | <data> |
----------------------------
Run Code Online (Sandbox Code Playgroud)
一切似乎都很完美.但是现在我只想查询这个特定的命名图数据:
$ arq --desc tdb.ttl "SELECT * WHERE{ GRAPH <data> {?s ?p ?o.}}"
-------------------
| s | p | o |
===================
| <d> | <e> | <f> |
-------------------
Run Code Online (Sandbox Code Playgroud)
为什么从tdbloader导入的数据丢失了?这个查询有什么问题?如何从两个导入中获得结果?
试试这个查询:
PREFIX : <data>
SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }
Run Code Online (Sandbox Code Playgroud)
而输出是
----------------------------
| s | p | o | g |
============================
| <a> | <b> | <c> | <data> |
| <d> | <e> | <f> | : |
----------------------------
Run Code Online (Sandbox Code Playgroud)
或尝试:
tdbquery --loc DB --file Q.rq -results srj
Run Code Online (Sandbox Code Playgroud)
以不同的形式获得结果.
文本输出是makign东西看起来不错,但最终有两个不同的东西<data>.
你看到的是那个
tdbloader --desc tdb.ttl --graph data data.ttl
Run Code Online (Sandbox Code Playgroud)
使用data完全一样是命名图形.但
INSERT DATA {GRAPH <data> {<d> <e> <f>.}}
Run Code Online (Sandbox Code Playgroud)
执行完整的SPARQL解析,并针对基URI进行解析,可能看起来像file://*currentdirectory*.
在文本中打印时,URI会缩写,包括使用基数.所以原来data(来自tdbloader)并file:///path/data显示为<data>.
PREFIX : <data>
Run Code Online (Sandbox Code Playgroud)
为文本输出提供了一种不同的写入方式:.
最后尝试:
BASE <http://example/>
SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }
Run Code Online (Sandbox Code Playgroud)
它将基本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> |
----------------------------------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
582 次 |
| 最近记录: |