使用tdbquery在TDB中查询命名的RDF图

时间:2015-08-05 11:22:49

标签: sparql rdf jena tdb named-graphs

我正在尝试使用tdbquery程序查询我新创建的TDB数据库。但是,我很难编写一个针对正确命名图的查询。我正在做以下事情:

首先创建一个新数据集并添加名为" facts"

的名称图
Dataset dataset = TDBFactory.createDataset("/tdb/");
dataset.begin(ReadWrite.WRITE) ;

try {
    Model facts = RDFDataMgr.loadModel("lineitem.ttl") ;
    dataset.addNamedModel("facts", facts);
    dataset.commit();
    TDB.sync(dataset);
    dataset.end();

} finally {
    dataset.close();
}

当我查询我的TDB数据库中的所有图表时,它看起来很好。

./tdbquery --loc /tdb/ "SELECT * { GRAPH ?g { ?s ?p ?o } }"

--------------------------------------------------
| s         | p           | o          | g       |
==================================================
| <fact1>   | <predicate> | <nation>   | <facts> |
| <fact2>   | <predicate> | <region>   | <facts> |
--------------------------------------------------

如果我尝试查询命名图表,我找不到并且三元组。

./tdbquery -v --loc /tdb/ "SELECT * { GRAPH <facts> { ?s ?p ?o } }"
OR
./tdbquery -v --loc /tdb/ "SELECT * FROM NAMED <facts> WHERE { ?s ?p ?o }"

-------------
| s | p | o |
=============
-------------

当我查看查询的代数版本时,我发现我的四边形中的上下文(图形)是错误的。

INFO  exec                 :: ALGEBRA
(quadpattern (quad <file:///usr/local/apache-jena-2.12.1/bin/facts> ?s ?p ?o))

我知道四边形图案应该是:   (四分之一?p?o)

如何查询TDB数据库中的命名图?

此致

2 个答案:

答案 0 :(得分:3)

  

当我查看查询的代数版本时,我看到了上下文   我的四边形中的(图表)是错误的。

INFO  exec                 :: ALGEBRA
(quadpattern (quad <file:///usr/local/apache-jena-2.12.1/bin/facts> ?s ?p ?o))
     

我知道四边形模式应该是:(quad ?s ?p ?o)

不正确(如果不是你期望的那样)

quadpattern搜索四边形,因此包含4个字段,第一个字段是要搜索的图形的名称

这就是你的问题所在,图形名称是URI,但你只提供facts作为名称,它被视为相对URI,因此受制于系统不同部分可能不同的分辨率。

在您的示例中,查询解析器使用工作目录作为基本URI,从而导致您在代数计划中看到的奇怪图形名称。

您可以通过发出以下查询来确切了解TDB商店中的图名:

SELECT ?g WHERE { GRAPH ?g { } }

如果你得到一个绝对URI,那么你可以直接在原始查询中指定它,如果你没有,那么就没有办法从命令行查询它。

解决问题

尽可能不要使用相对URI。如果您确实想要使用它们,那么在没有明确指定基本URI的情况下不要使用它们

因此,在您加载数据的代码中,请确保为图表提供绝对URI,例如

dataset.addNamedModel("http://example.org/facts", facts);

如果您确实希望能够使用相对URI在查询中引用您的图表,请使用适当的BASE声明,以便根据需要解析URI。

./tdbquery -v --loc /tdb/ "BASE <http://example.org/> SELECT * { GRAPH <facts> { ?s ?p ?o } }"

答案 1 :(得分:2)

这里的问题是您已将相对URI图名称放入数据中。 RDF被定义为使用绝对URI(即以“http:”或其他一些URI方案名称开头)。

尝试

tdbquery

更清楚地了解数据集中的内容。 file:///usr/local/apache-jena-2.12.1/bin/facts的输出可能会调​​用URI缩短器,因此您的某些数据具有绝对URI和一些相对但在文本格式中看起来相同。

当解析“SELECT * {GRAPH {?s?p?o}}”时,就像从文件读取数据一样,相对URI被解析 - 基URI是代码运行的地方,因此你得到{ {1}}

尝试dataset.addNamedModel("http://example/facts", facts);

PS 1

Model m = dataset.getNamedModel("http://example/facts") ;
m.read("lineitem.ttl") ;

PS 2 如果您使用交易

,则不需要sync()