单一四方+最基本的SPARQL查询= 1结果在耶拿,2结果在芝麻 - 谁是对的?

Pat*_*ett 5 rdf sesame sparql jena named-graphs

将这个四元组添加到空商店:

<http://x.com/s> <http://x.com/p> 2 <http://x.com/g> .
Run Code Online (Sandbox Code Playgroud)

然后执行这个SPARQL查询(取自Bob DuCharme的书'Learning SPARQL',所以这必须是标准的SPARQL,用于检索数据集中的所有四边形,无论实现如何,对吧!?):

SELECT ?g ?s ?p ?o
WHERE {
{ ?s ?p ?o }
UNION
{ GRAPH ?g { ?s ?p ?o } } }
Run Code Online (Sandbox Code Playgroud)

但耶拿和芝麻回答不同的答案!!?这是我看到的:

Tomcat 6.0.37上的Jena Fuseki控制台(版本2.10.0 - 开箱即用,没有配置更改!) - (正如我所理解的那样正确答案):

--------------------------------------------------------------
| g                | s                | p                | o |
==============================================================
| <http://x.com/g> | <http://x.com/s> | <http://x.com/p> | 2 |
--------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

Tomcat 6.0.37上的Sesame Workbench(版本2.7.3 - 开箱即用,无需更改配置!):只需使用工作台中的"添加"功能手动添加上述四边形(选择"N-Quad")在"数据格式"下拉框中,在"输入您要上传的RDF数据"编辑框中,然后运行以上查询:

--------------------------------------------------------------
| g                | s                | p                | o |
==============================================================
|                  | <http://x.com/s> | <http://x.com/p> | 2 |
| <http://x.com/g> | <http://x.com/s> | <http://x.com/p> | 2 |
--------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

所以对于那些开始关注RDF的人来说这有点吓人 - 我在这里错过了什么?我认为芝麻不能"错" - 所以它必须是我的'解释'我想(或者Bob的查询不是'标准的SPARQL',因此不同的实现可以自由地返回不同的结果) - 任何启示都会非常欢迎:)!

Jee*_*tra 8

正如@Joshua Taylor在评论中指出的那样,原因是Sesame和Jena使用了对默认图的不同解释.

在Sesame中,整个存储库被视为默认图:所有命名图中的所有语句以及没有命名图的所有语句.因此,你的工会,其查询默认图形,成功和结合的第一个参数?s,?p?o(但不是?g).你的联盟的第二个论点显然也是成功的,因为原来的四元组当然是在命名图中,因此你得到两个答案.

默认情况下,Jena使用"独占"默认图:只有未明确添加到任何特定命名图的语句才会出现在默认图中.因此,在Jena中,联合的第一部分失败(在Jena的默认图中没有匹配的语句),第二部分成功,因此您只得到1个结果.

听起来很奇怪,两者都是正确的.不同之处仅在于如何设置执行查询的数据集.

当然,有办法解决这个问题.在Jena和Sesame中,您可以添加FROM (NAMED)子句以使其明确查询所查询的数据集(Sesame提供sesame:nil图形名称以显式查询那些没有关联命名图的语句).或者,您可以以编程方式修改执行查询的数据集定义.Jena和Sesame的精确机制有点不同,但它们都有选项(在芝麻中,你可以Dataset在执行前用查询创建和提供一个对象,在Jena中我相信你可以重新配置你的实际商店或模型执行查询以表现不同).

  • 在发布之前的评论后,我研究了在 Jena 中获取默认和联合图的方法。[文档](http://jena.apache.org/documentation/tdb/datasets.html) 描述了两个特殊的图,`urn:x-arq:UnionGraph` 和 `urn:x-arq:DefaultGraph`。 (4认同)
  • 我不必在查询中:如果你通过上下文设置TDB.getContext().set(TDB.symUnionDefaultGraph,true); 然后查询默认图是命名图的并集.请参阅http://jena.apache.org/documentation/tdb/datasets.html (4认同)