gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:53:11 24 4
gpt4 key购买 nike

我想知道如何在 SPARQL 中评估组模式。我的假设是分别评估每个组模式,然后将组中的解决方案绑定(bind)连接在一起。然而,似乎并非如此。

让我们以这个示例数据为例:

:film1 :hasDirector :director1.

让我们在查询之后有这个例子:

select * where {
{?a :hasDirector ?c.}
{optional {?c :fromCountry ?e}}.
}

我假设每个组将分别进行评估,然后将合并两个组的结果。在关系代数方面,它看起来像 first_group INNER-JOIN second_group。然而,事实并非如此……分别评估每个组;第一个组模式产生解决方案:?a = :film1, ?c = :director1。第二个三重模式没有产生任何解决方案。现在,如果我的假设是正确的,加入结果将不会返回任何解决方案。但是,此查询返回一个解决方案,其中包含 ?a = :film1 ,?c = :director1, ?e unbound

此结果与没有使用组{} 相同,也与执行以下查询相同:

select * where {
?a :hasDirector ?c.
optional {?c :fromCountry ?e}.
}

最后一个查询(再次关联以方便理解)first_group LEFT-OUTER-JOIN second_group

如何在 SPARQL 中评估组模式?我在这里错过了什么?

附言。我正在使用 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:

难道是这个原因?在连接中处理未绑定(bind)值(如关系数据库中的预空值)是很奇怪的。参见附录 C here .

编辑4:

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

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

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

最佳答案

你说:

The second triple pattern does not yield any solution

没错。但是第二组 {optional {...}}确实产生了一个解决方案。那是因为 { OPTIONAL { A } } 等同于 { {} OPTIONAL { A } } 等同于 {} if A 没有解。空组 {} 始终生成一个不绑定(bind)任何变量的解决方案,也称为空解决方案

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

您的第二个查询 与您的第一个查询不同。它的基本结构是{ {TP1} OPTIONAL {TP2} } 。所以左连接现在位于两个三元组模式之间,并且在 OPTIONAL 之前没有插入隐式的额外空组。

在您的编辑 3 中,您向第二组添加了一个筛选条件,该条件在空绑定(bind)上的计算结果为 false。所以空绑定(bind)从解决方案序列中删除,现在第二组实际上没有结果。连接现在位于单解序列和零解序列之间,这通常会导致无解。这解释了您的编辑 3。

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

关于sparql - 如何在 SPARQL 中评估/加入组模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56067639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com