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