【发布时间】:2013-09-19 10:00:23
【问题描述】:
在连接 ARQ、TDB 和 Named Graphs 的命令行工具时出现了奇怪的行为。如果在命名图中通过 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> |
----------------------------
一切看起来都很完美。但现在我只想查询这个名为图 data 的特定:
$ arq --desc tdb.ttl "SELECT * WHERE{ GRAPH <data> {?s ?p ?o.}}"
-------------------
| s | p | o |
===================
| <d> | <e> | <f> |
-------------------
为什么从 tdbloader 导入的数据丢失了?这个查询有什么问题?如何从两个导入中获取结果?
【问题讨论】:
-
我不知道为什么会这样,但谢谢提出了一个深思熟虑的问题,并提供了一个我们可以用来重现问题的最小工作示例!
-
更多有趣的结果,见pastebin.com/3cT4fagi。简而言之,
SELECT * WHERE { values ?g { <data> } graph ?g { ?s ?p ?o }}只返回 one 值,但SELECT * WHERE { values ?s { <a> <d> } graph ?g { ?s ?p ?o }}返回 2,SELECT * WHERE { values ?g { <data> UNDEF } graph ?g { ?s ?p ?o }}返回 3(结果重复)。 -
有趣的是,如果你使用绝对 URI 而不是相对 URI,就像我在 pastebin.com/ViWmNmWT 中展示的那样,你会得到你想要的结果。
-
我想知道这里发生的情况是否是
tdbloader --desc tdb.ttl --graph data data.ttl和update --desc tdb.ttl "INSERT DATA {GRAPH <data> {<d> <e> <f>.}}"中的相对 URI 的解析方式不同,因此您最终会得到两个不同的 URI,它们恰好打印在这些结果的方式相同。 -
是的 - 感谢您提供完整的最小示例。我花了更多时间来回答这个问题,否则我可能会这样做。
标签: sparql jena tdb arq named-graphs