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

Querying named RDF graphs in TDB using tdbquery

我正在尝试使用 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 数据库中的命名图?

此致

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

When I look at the algebra version of the query I see that the context (the graph) in my quad is wrong.

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

I know that the quad pattern should be: (quad ?s ?p ?o)

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

A 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 } }"