1

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

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

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

问候

4

2 回答 2

3

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

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

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

不正确(如果不是您所期望的)

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

这就是您的问题所在,图形名称是 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 } }"
于 2015-08-05T17:26:52.167 回答
2

这里的问题是您已将相对 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()

于 2015-08-05T17:25:55.833 回答