我想知道如何在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获取查询代数...似乎证实了我的期望?
这是我从耶拿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:
尽管代数的外观与我刚刚显示的一样,Jena对于第一个查询给出了GraphDB相同的结果。
EDIT3:
这可能是原因吗?连接中对未绑定值的处理(在关系数据库中为pre null)是很奇怪的。参见附录C here。
EDIT4:
似乎问题出在 EDIT3 中,在第一个查询中添加FILTER (BOUND (?c))
会得到预期的结果!
select * where {
{?a :hasDirector ?c.}
{optional {?c :fromCountry ?e} FILTER (BOUND (?c))}.
}
但是现在再次...当发生两个随后的组模式时,默认行为是什么? them他们吗忽略此未绑定(空)问题。
答案 0 :(得分:2)
您说:
第二个三重图案不会产生任何解决方案
是正确的。但是第二组{optional {...}}
确实产生了一个解决方案。这是因为{ OPTIONAL { A } }
等效于{ {} OPTIONAL { A } }
,如果{}
没有解决方案,则等效于A
。空组{}
总是产生一个不绑定任何变量的解决方案,也称为空解决方案。
因此,您的第一个查询是两个单解决方案序列的连接。左侧是:hasDirector
三元模式的解决方案。右边是空解决方案。叉积只产生一种组合;不可见的联接条件会删除具有冲突变量绑定的任何组合,但是此处没有冲突,因此我们保留单个组合。因此,结果就是您看到一个绑定。
您的第二个查询与您的第一个查询不同。其基本结构为{ {TP1} OPTIONAL {TP2} }
。因此,左联接现在位于两个三重模式之间,并且在OPTIONAL
之前没有插入任何隐式的额外空组。
在您的编辑3 中,您向第二组添加了一个过滤条件,该条件在空绑定中的值为false
。因此从解决方案序列中删除了空绑定,现在第二组 actually 没有结果。现在,连接处于一解序列和零解序列之间,这很容易导致没有解。这说明了您的修改3。
未绑定:SPARQL没有NULL
。 SPARQL中的“未绑定”只是在特定解决方案中变量根本不绑定任何值的条件。 SQL具有行和列,因此您具有单元格,并且单元格始终具有一个值,但是该值可以是特殊值NULL
。 SPARQL有行但没有列;您在SELECT
结果中看到的“列”仅在末尾出于演示目的而引入。但在查询评估期间不起作用。在每一行中(也称为解决方案),绑定了零个或多个变量,即它们被分配了一个值。并且其他任何变量(无穷大)都是无界的。