我想知道如何在SPARQL中评估组模式。我的假设是,每个组模式分别进行评估,然后将来自组的解决方案绑定连接在一起。然而,情况似乎并非如此。
让我们以这个示例数据为例:
:film1 :hasDirector :director1.让我们来看看下面的查询:
select * where {
{?a :hasDirector ?c.}
{optional {?c :fromCountry ?e}}.
}我假设每个小组将分别进行评估,然后两个小组的结果将结合在一起。就关系代数而言,它看起来像first_group INNER-JOIN second_group。然而,事实并非如此.分别评估每一组;第一组模式将解决方案:?a = :film1, ?c = :director1。第二个三重模式does not yield any solution。如果我的假设是正确的,加入结果就不会返回任何解决方案。但是,此查询使用?a = :film1 ,?c = :director1, ?e unbound返回一个解决方案。
此结果与没有使用{}的组相同,也与执行以下查询相同:
select * where {
?a :hasDirector ?c.
optional {?c :fromCountry ?e}.
}最后一个查询(再次是关系查询,以便于理解) first_group LEFT-OUTER-JOIN second_group。
如何在SPARQL中评估组模式?,我在这里错了什么?
PS。我用GraphDB测试.
EDIT1:
现在试图通过Jena ARQ获得查询代数..。似乎证实了我的预期?
这是我从Jena ARQ获得的第一个查询代数:
(join
(bgp (triple ?a <http://www.example.com/hasDirector> ?c))
(leftjoin
(table unit)
(bgp (triple ?c <http://www.example.com/fromCountry> ?e))))第二个查询:
(leftjoin
(bgp (triple ?a <http://www.example.com/hasDirector> ?c))
(bgp (triple ?c <http://www.example.com/fromCountry> ?e)))EDIT2:
对于第一个查询,耶拿给出了同样的GraphDB结果,尽管代数看起来像我刚才展示的那样。
EDIT3:
这就是原因吗?在联接中处理未绑定值(在关系DB中为pre )是非常奇怪的。见附录C 这里。
EDIT4:
似乎问题就像EDIT3中提到的那样,在第一个查询中添加FILTER (BOUND (?c))会给出预期的结果!
select * where {
{?a :hasDirector ?c.}
{optional {?c :fromCountry ?e} FILTER (BOUND (?c))}.
}但现在又..。当两个后续的组模式发生时,默认行为应该是什么?逗他们开心?忽略这个未绑定(null)问题。
发布于 2019-05-10 09:15:12
你说:
第二个三重模式不产生任何解决方案。
这是正确的。但是第二组,{optional {...}},确实给出了一个解决方案。这是因为{ OPTIONAL { A } }等同于{ {} OPTIONAL { A } },如果A没有解决方案,它就相当于{}。空组{}总是生成一个不绑定任何变量的解决方案,也称为(空解决方案)。
因此,您的第一个查询是两个单解决方案序列的连接。左边是:hasDirector三重模式的解决方案.右边是空的解决方案。交叉产品只产生一个组合;不可见的联接条件删除任何使用冲突变量绑定的组合,但是这里没有冲突,所以我们保留单个组合。所以,结果就是你看到了一个绑定。
第二个查询与第一个查询不同。其基本结构为{ {TP1} OPTIONAL {TP2} }。因此,左联接现在在这两个三重模式之间,在OPTIONAL之前没有插入任何隐含的额外空组。
在您的编辑3中,您向第二个组添加了一个筛选条件,该组的计算结果为空绑定上的false。因此,空绑定从解决方案序列中删除,现在第二个组实际上没有结果。连接现在介于单解序列和零解序列之间,这会导致无解。这解释了你的编辑3。
未绑定: SPARQL没有NULL。SPARQL中的“Unbound”只是一个变量在一个特定的解决方案中根本没有绑定到任何值的条件。SQL有行和列,所以您有单元格,单元格总是有一个值,但是值可以是特殊值NULL。SPARQL有行,但没有列;您在SELECT结果中看到的“列”只是为了表示目的而在末尾引入的。但在查询计算过程中不起任何作用。在每一行(A)。解决方案),零或多个变量被绑定,也就是说,它们被赋值给一个值。并且任何其他变量(一个无穷多)都是无界的。
https://stackoverflow.com/questions/56067639
复制相似问题