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

时间:2019-05-09 21:11:49

标签: sparql graphdb

我想知道如何在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他们吗忽略此未绑定(空)问题。

1 个答案:

答案 0 :(得分:2)

您说:

  

第二个三重图案不会产生任何解决方案

是正确的。但是第二组{optional {...}} 确实产生了一个解决方案。这是因为{ OPTIONAL { A } }等效于{ {} OPTIONAL { A } },如果{}没有解决方案,则等效于A。空组{}总是产生一个不绑定任何变量的解决方案,也称为空解决方案

因此,您的第一个查询是两个单解决方案序列的连接。左侧是:hasDirector三元模式的解决方案。右边是空解决方案。叉积只产生一种组合;不可见的联接条件会删除具有冲突变量绑定的任何组合,但是此处没有冲突,因此我们保留单个组合。因此,结果就是您看到一个绑定。

您的第二个查询与您的第一个查询不同。其基本结构为{ {TP1} OPTIONAL {TP2} }。因此,左联接现在位于两个三重模式之间,并且在OPTIONAL之前没有插入任何隐式的额外空组。

在您的编辑3 中,您向第二组添加了一个过滤条件,该条件在空绑定中的值为false。因此从解决方案序列中删除了空绑定,现在第二组 actually 没有结果。现在,连接处于一解序列和零解序列之间,这很容易导致没有解。这说明了您的修改3。

未绑定:SPARQL没有NULL。 SPARQL中的“未绑定”只是在特定解决方案中变量根本不绑定任何值的条件。 SQL具有行和列,因此您具有单元格,并且单元格始终具有一个值,但是该值可以是特殊值NULL。 SPARQL有行但没有列;您在SELECT结果中看到的“列”仅在末尾出于演示目的而引入。但在查询评估期间不起作用。在每一行中(也称为解决方案),绑定了零个或多个变量,即它们被分配了一个值。并且其他任何变量(无穷大)都是无界的。