如何在SPARQL中评估/加入组模式

如何在SPARQL中评估/加入组模式,sparql,graphdb,Sparql,Graphdb,我想知道在SPARQL中如何评估组模式。我的假设是,每个组模式都是单独评估的,然后将来自组的解决方案绑定连接在一起。然而,情况似乎并非如此 让我们以以下数据为例: :film1 :hasDirector :director1. 让我们以下面的查询为例: select * where { {?a :hasDirector ?c.} {optional {?c :fromCountry ?e}}. } 我假设每个小组将分别进行评估,然后将两个小组的结果合并在一起。就关系代数而言,它看起

我想知道在SPARQL中如何评估组模式。我的假设是,每个组模式都是单独评估的,然后将来自组的解决方案绑定连接在一起。然而,情况似乎并非如此

让我们以以下数据为例:

: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))}.
    }