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

tbloader与SPARQL INSERT-为什么命名图的行为不同?,sparql,jena,tdb,arq,named-graphs,Sparql,Jena,Tdb,Arq,Named Graphs,在ARQ、TDB和命名图的命令行工具的连接中有一种奇怪的行为。如果在命名图中通过tdbloader导入数据,则无法通过SPARQL SELECT查询中的graph子句进行查询。但是,在使用SPARQL INSERT将数据插入同一个图形中时,可以执行此查询 我有以下汇编程序描述文件tdb.ttl: 文件data.ttl中有一个数据集: 现在,我将使用tdbloader插入此数据,然后使用SPARQL INSERT插入另一个三元组,这两个数据都在命名的图形数据中: 现在,可以通过以下方式使用SPAR

在ARQ、TDB和命名图的命令行工具的连接中有一种奇怪的行为。如果在命名图中通过tdbloader导入数据,则无法通过SPARQL SELECT查询中的graph子句进行查询。但是,在使用SPARQL INSERT将数据插入同一个图形中时,可以执行此查询

我有以下汇编程序描述文件tdb.ttl:

文件data.ttl中有一个数据集:

现在,我将使用tdbloader插入此数据,然后使用SPARQL INSERT插入另一个三元组,这两个数据都在命名的图形数据中:

现在,可以通过以下方式使用SPARQL查询数据:

$arq --desc tdb.ttl "SELECT *  WHERE{ GRAPH ?g {?s ?p ?o.}}"
----------------------------
| s   | p   | o   | g      |
============================
| <a> | <b> | <c> | <data> |
| <d> | <e> | <f> | <data> |
----------------------------
一切似乎都很完美。但现在我只想查询这个指定的命名图数据:

为什么从tdbloader导入的数据丢失?这个查询有什么问题?如何从两个导入中获取结果?

尝试以下查询:

PREFIX : <data>
SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }
以不同的形式获得结果

文本输出使事情看起来很好,但两个不同的事情最终会变成

你看到的是

tdbloader --desc tdb.ttl --graph data data.ttl
按原样使用数据来命名图形。但是

INSERT DATA {GRAPH <data> {<d> <e> <f>.}}
为文本输出提供了另一种写入方式:

最后尝试:

BASE <http://example/>
SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }
它将基本URI设置为数据URI附近的no where,因此关闭基本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> |
----------------------------------------------------------------------------------------------------------------

我不知道为什么会发生这种情况,但感谢您提出了一个经过深思熟虑的问题,并提供了一个最小的工作示例,我们可以用它来重现这个问题!有关三个更有趣的结果,请参阅。简而言之,选择*WHERE{values?g{}graph?g{s?p?o}只返回一个值,但选择*WHERE{values?s{graph?g{s?p?o}返回两个值,选择*WHERE{values?g{UNDEF}graph?g{s?p?o}返回三个值,则有一个重复的结果。有趣的是,如果使用绝对URI而不是相对URI,正如我在中所展示的,您将得到您想要的结果。我不知道这里发生的是不是tdbloader-desc tdb.ttl-graph data data.ttl和update-desc tdb.ttl INSERT data{graph{}中的相对URI得到的解决方式不同,因此您将得到两个不同的URI,它们恰好以相同的方式打印在这些结果中。是的-感谢您提供了一个完整的、最少的示例。我花了更多的时间回答这个问题,否则我可能会这样做。谢谢你对这个问题的详细解释。然后我将使用绝对URI。那么,工会就没有必要了。
----------------------------
| s   | p   | o   | g      |
============================
| <a> | <b> | <c> | <data> |
| <d> | <e> | <f> | :      |
----------------------------
 tdbquery --loc DB --file Q.rq -results srj
tdbloader --desc tdb.ttl --graph data data.ttl
INSERT DATA {GRAPH <data> {<d> <e> <f>.}}
PREFIX : <data>
BASE <http://example/>
SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }
----------------------------------------------------------------------------------------------------------------
| 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> |
----------------------------------------------------------------------------------------------------------------