只需将这一个四边形添加到空存储区:
<http://x.com/s> <http://x.com/p> 2 <http://x.com/g> .
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-开箱即用,没有配置更改!):只需使用Workbench中的“添加”功能,在“输入您希望上载的RDF数据”编辑框中手动添加上述四元组(在“数据格式”下拉框中选择了“N-Quad”),然后运行上述查询:
--------------------------------------------------------------
| 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”,所以不同的实现可以自由返回不同的结果)--任何启示都将是非常欢迎的:)!
正如@Joshua Taylor在他的评论中指出的,原因是Sesame和Jena使用了不同的默认图解释。
在Sesame中,整个存储库被认为是默认图:所有命名图中的所有语句,以及没有命名图的所有语句。因此,查询默认图的联合的第一个参数成功并绑定?s
、?p
和?o
(但不绑定?g
)。你的联合的第二个参数显然也成功了,因为原来的四元组当然是在一个命名图中,因此你得到了两个答案。
默认情况下,Jena使用“独占”默认图:默认图中只有未显式添加到任何特定命名图中的语句。因此,在Jena中,联合的第一部分失败(在Jena的默认图中没有匹配的语句),第二部分成功,因此只得到1个结果。
虽然听起来很奇怪,但两者都是正确的。不同之处在于执行查询的数据集是如何设置的。
当然,这是有办法处理的。在Jena和Sesame中,您都可以添加from(NAMED)
子句,使查询的数据集是什么显式(Sesame提供Sesame:nil
图名,以显式查询那些没有关联命名图的语句)。或者,可以编程方式修改执行查询的数据集定义。Jena和Sesame中的精确机制有点不同,但它们都有选项(在Sesame中,您可以在执行查询之前创建并提供DataSet
对象,在Jena中,我相信您可以重新配置执行查询的实际存储或模型,使其具有不同的行为)。