如何在SPARQL中评估/加入组模式
我想知道在SPARQL中如何评估组模式。我的假设是,每个组模式都是单独评估的,然后将来自组的解决方案绑定连接在一起。然而,情况似乎并非如此 让我们以以下数据为例:如何在SPARQL中评估/加入组模式,sparql,graphdb,Sparql,Graphdb,我想知道在SPARQL中如何评估组模式。我的假设是,每个组模式都是单独评估的,然后将来自组的解决方案绑定连接在一起。然而,情况似乎并非如此 让我们以以下数据为例: :film1 :hasDirector :director1. 让我们以下面的查询为例: select * where { {?a :hasDirector ?c.} {optional {?c :fromCountry ?e}}. } 我假设每个小组将分别进行评估,然后将两个小组的结果合并在一起。就关系代数而言,它看起
:film1 :hasDirector :director1.
让我们以下面的查询为例:
select * where {
{?a :hasDirector ?c.}
{optional {?c :fromCountry ?e}}.
}
我假设每个小组将分别进行评估,然后将两个小组的结果合并在一起。就关系代数而言,它看起来像first\u-group-internal-JOIN-second\u-group
。然而,事实并非如此。。。
分别对各组进行评价;第一组模式是解决方案:?a=:film1,?c=:director 1
。第二个三重模式不会产生任何解决方案
。如果我的假设是正确的,加入结果不会返回任何解决方案。但是,此查询返回一个解决方案,其中?a=:film1,?c=:director1,?e未绑定
此结果与没有使用组的情况相同,也与执行以下查询的情况相同:
select * where {
?a :hasDirector ?c.
optional {?c :fromCountry ?e}.
}
最后一个查询(也是为了便于理解而进行的相关查询)first\u group LEFT-OUTER-JOIN second\u group
如何在SPARQL中评估组模式?我在这里遗漏了什么
另外,我正在使用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))))
但现在再次。。。当两个后续的组模式发生时,默认行为应该是什么?为他们高兴?忽略这个未绑定(空)问题。你说:
第二种三重模式不会产生任何解决方案
这是正确的。但是第二组,{optional{…}}
确实产生了一个解决方案。这是因为{OPTIONAL{A}}
相当于{{}OPTIONAL{A}
,如果A
没有解决方案,这相当于{}
。空组{}
总是生成一个不绑定任何变量的解决方案,也称为空解决方案
因此您的第一个查询是两个一元化解决方案序列的联接。左侧是:hasDirector
三重模式的解决方案。右边是空溶液。叉积只产生一个组合;“不可见连接”条件将删除具有冲突变量绑定的任何组合,但此处没有冲突,因此我们保留单个组合。因此,结果就是您看到的绑定
第二个查询与第一个查询不同。它的基本结构是{TP1}可选的{TP2}
。因此,左连接现在位于两个三重模式之间,并且在可选
之前没有插入隐式额外的空组
在编辑3中,您向第二个组添加了一个筛选条件,该组在空绑定上的计算结果为false
。因此,从解决方案序列中删除空绑定,现在第二组实际上没有结果。现在连接在一个解序列和一个零解序列之间,这很容易导致没有解。这解释了你的编辑3
未绑定:SPARQL没有NULL
。SPARQL中的“未绑定”只是一个变量在特定解决方案中根本不绑定到任何值的条件。SQL有行和列,所以有单元格,单元格总是有值,但值可以是特殊值NULL
。SPARQL有行但没有列;您在SELECT
结果中看到的“列”仅在最后介绍,以便于演示。但在查询求值过程中不起作用。在每一行(也称为解决方案)中,都会绑定零个或多个变量,也就是说,它们被分配给一个值。任何其他变量(无限数)都是未绑定的。可选的aka LEFT JOIN不会减少左侧的解决方案,因此在这两种情况下,它只能为左侧的当前解决方案添加?e
的绑定(对于第一种情况,解决方案来自于对:hasDirector模式的评估,对于第二种情况,解决方案来自于对空的{}
bgp的评估,后者有一个没有绑定的单一解决方案),所以您说:1.在第一个查询中,(没有使用组),optional的左侧是一个空的组模式{}它有一个没有绑定的单一解决方案。将此解决方案与第一个组连接将产生我的“意外”结果。2.我关于连接组的假设是正确的?(对像{first_group}{second_group}
这样的组进行内部评估,然后连接它们的绑定)?谢谢你的解释…但是,要回答我的主要问题,正如你所看到的,我对加入组模式的假设是正确的吗?(像这样的组,其中{first_group}.{second_group}}
在内部进行评估,然后加入它们产生的绑定)。你能让我参考一些资源吗?@MedianHilal如果你问的是评估是否是自下而上的,那么答案是肯定的。例如,子查询也是如此,它也是先评估然后“组合”的查询的外部部分。是的,分组图模式是单独计算的。顺便说一下,几年前有人问过一个稍微类似的问题:-你也许还应该看看Andy在回答下面的第二条评论,他还提到了蕴涵和筛选评估以及scope@MedianHilal是的,评估组ps是自下而上的(或者我更喜欢说是由内而外的)。当阅读SPARQL规范中的形式主义时,这一点就变得很清楚了,但是您或多或少都要经历整个过程,直到有一个清晰的画面
(leftjoin
(bgp (triple ?a <http://www.example.com/hasDirector> ?c))
(bgp (triple ?c <http://www.example.com/fromCountry> ?e)))
select * where {
{?a :hasDirector ?c.}
{optional {?c :fromCountry ?e} FILTER (BOUND (?c))}.
}