首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tbloader对SPARQL插入-为什么命名图形的不同行为?

tbloader对SPARQL插入-为什么命名图形的不同行为?
EN

Stack Overflow用户
提问于 2013-09-19 10:00:23
回答 1查看 681关注 0票数 5

在ARQ、TDB和命名图的命令行工具的连接中有一种奇怪的行为。如果通过命名图中的tdbloader导入数据,则不能通过SPARQL SELECT查询中的Graph子句查询数据。但是,当SPARQL INSERT将数据插入到同一个图中时,此查询是可能的。

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

代码语言:javascript
复制
@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中有一个数据集

代码语言:javascript
复制
<a> <b> <c>.

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

代码语言:javascript
复制
tdbloader --desc tdb.ttl --graph data data.ttl
update --desc tdb.ttl "INSERT DATA {GRAPH <data> {<d> <e> <f>.}}"

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

代码语言:javascript
复制
$arq --desc tdb.ttl "SELECT *  WHERE{ GRAPH ?g {?s ?p ?o.}}"
----------------------------
| s   | p   | o   | g      |
============================
| <a> | <b> | <c> | <data> |
| <d> | <e> | <f> | <data> |
----------------------------

一切看起来都很完美。但是现在我只想查询这个指定的图形数据。

代码语言:javascript
复制
$ arq --desc tdb.ttl "SELECT *  WHERE{ GRAPH <data> {?s ?p ?o.}}"
-------------------
| s   | p   | o   |
===================
| <d> | <e> | <f> |
-------------------

为什么从tdbloader导入的数据丢失?这个查询有什么问题?如何才能从这两种进口产品中得到结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-19 13:19:49

请尝试以下查询:

代码语言:javascript
复制
PREFIX : <data>
SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }

输出是

代码语言:javascript
复制
----------------------------
| s   | p   | o   | g      |
============================
| <a> | <b> | <c> | <data> |
| <d> | <e> | <f> | :      |
----------------------------

或尝试:

代码语言:javascript
复制
 tdbquery --loc DB --file Q.rq -results srj

以不同的形式得到结果。

文本输出使事物看起来很漂亮,但是两种不同的东西以<data>结尾。

你看到的是

代码语言:javascript
复制
tdbloader --desc tdb.ttl --graph data data.ttl

使用data就像命名图形一样。但

代码语言:javascript
复制
INSERT DATA {GRAPH <data> {<d> <e> <f>.}}

执行完整的SPARQL解析,并对基本URI进行解析,可能类似于file://*currentdirectory*

在文本打印时,URI会被缩写,包括使用基。因此,原始data (来自tdbloader)和file:///path/data都以<data>的形式出现。

代码语言:javascript
复制
PREFIX : <data>

为文本输出提供了一种不同的方式将其编写为:

最后,尝试:

代码语言:javascript
复制
BASE <http://example/>
SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } }

它将基URI设置为“不在数据URI附近的位置”,因此可以通过基URI关闭良好的格式设置:

代码语言:javascript
复制
----------------------------------------------------------------------------------------------------------------
| 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> |
----------------------------------------------------------------------------------------------------------------
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18891690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档