首页 > 解决方案 > 如何在 SPARQL 中评估/加入组模式

问题描述

我想知道如何在 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 进行测试...

编辑1:

现在尝试通过 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)))

编辑2:

Jena 在第一个查询中给出了与 GraphDB 相同的结果,尽管代数看起来就像我刚刚展示的那样。

编辑3:

这可能是原因吗?在连接中处理未绑定的值(作为关系数据库中的 pre null )是很奇怪的。请参阅此处的附录C。

编辑4:

似乎问题如EDIT3中所述,在第一个查询中添加FILTER (BOUND (?c))将给出预期结果!

select * where {
      {?a :hasDirector ?c.} 
      {optional {?c :fromCountry ?e} FILTER (BOUND (?c))}.
    }

但是现在再次......当两个后续组模式发生时,默认行为应该是什么?加入他们?忽略此未绑定(空)问题。

标签: sparqlgraphdb

解决方案


你说:

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

那是对的。但是第二组,{optional {...}}确实产生了解决方案。那是因为{ OPTIONAL { A } }is 等价于{ {} OPTIONAL { A } }which 等价于{}ifA没有解。空组{}总是产生一个不绑定任何变量的解,也称为空解

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

您的第二个查询与您的第一个查询不同。它的基本结构是{ {TP1} OPTIONAL {TP2} }。因此,左连接现在位于两个三元组模式之间,并且在OPTIONAL.

在您的编辑 3中,您向第二组添加了一个过滤条件,该条件对false空绑定进行评估。所以空绑定从解序列中​​移除,现在第二组实际上没有结果。连接现在在一个解决方案序列和一个零解决方案序列之间,这很容易导致没有解决方案。这解释了您的编辑 3。

未绑定: SPARQL 没有NULL. SPARQL 中的“未绑定”只是变量在特定解决方案中根本不绑定到任何值的条件。SQL 有行和列,所以你有单元格,并且单元格总是有一个值,但这个值可以是特殊值NULL。SPARQL 有行但没有列;您在结果中看到的“列”SELECT仅在最后引入以用于演示目的。但在查询评估期间不起作用。在每一行(又名解决方案)中,绑定了零个或多个变量,也就是说,它们被分配了一个值。并且任何其他变量(无限数量)都是未绑定的。


推荐阅读