5

仅将这个四边形添加到空商店:

<http://x.com/s> <http://x.com/p> 2 <http://x.com/g> .

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

SELECT ?g ?s ?p ?o
WHERE {
{ ?s ?p ?o }
UNION
{ GRAPH ?g { ?s ?p ?o } } }

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

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 |
--------------------------------------------------------------

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 |
--------------------------------------------------------------

所以这对于开始关注 RDF 的人来说有点可怕——我在这里错过了什么?我认为 Sesame 不可能是“错误的”——所以我想它一定是我的“解释”(或者 Bob 的查询不是“标准 SPARQL”,因此不同的实现可以自由地返回不同的结果)——任何启示都会非常欢迎 :) !

4

1 回答 1

8

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

在 Sesame 中,整个存储库被视为默认图:所有命名图中的所有语句以及所有没有命名图的语句。因此,查询默认图的 union 的第一个参数成功并绑定了?s,?p?o(但不是?g)。您的 union 的第二个参数显然也成功了,因为原始四边形当然在命名图中,因此您得到两个答案。

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

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

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

于 2013-08-21T22:49:03.153 回答