gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:50:02 26 4
gpt4 key购买 nike

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 插入另一个三元组,两者都在命名图形数据中:
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导入的数据丢失了?这个查询有什么问题?如何从两个导入中获取结果?

最佳答案

试试这个查询:

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

以不同的形式获得结果。

文本输出看起来不错,但两个不同的东西最终是 <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> |
----------------------------------------------------------------------------------------------------------------

关于sparql - tbloader 与 SPARQL INSERT - 为什么命名图的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18891690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com