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



我正在尝试使用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 |
=============
-------------

当我查看查询的代数版本时,我看到上下文(图)在我的quad中是错误的。

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

我知道四元模式应该是:(q ?s ?p ?o)

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

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

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

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

不,这是正确的(如果不是你期望的)

quadpattern搜索quads,因此包含4个字段,其中第一个字段是要搜索的图的名称

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

在您的示例中,查询解析器使用工作目录作为Base 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 } }"

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

RDFDataMgr.write(System.out, dataset, Lang.NQUADS)

以更清楚地查看数据集中的内容。tdbquery的输出可能会调用URI缩短器,因此您的一些数据具有绝对URI和一些相对URI,但在文本格式中看起来是相同的。

当"SELECT * {GRAPH {?s ?p ?o}}"被解析时,就像你从文件中读取数据一样,相对URI被解析——基本URI是代码运行的地方,所以你得到file:///usr/local/apache-jena-2.12.1/bin/facts

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

PS 1

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

PS 2如果使用事务

,则不需要Sync ()

相关内容

  • 没有找到相关文章

最新更新