sparql - 如何在 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))}.
}
但是现在再次......当两个后续组模式发生时,默认行为应该是什么?加入他们?忽略此未绑定(空)问题。
解决方案
你说:
第二个三重模式不会产生任何解决方案
那是对的。但是第二组,{optional {...}}
,确实产生了解决方案。那是因为{ OPTIONAL { A } }
is 等价于{ {} OPTIONAL { A } }
which 等价于{}
ifA
没有解。空组{}
总是产生一个不绑定任何变量的解,也称为空解。
因此,您的第一个查询是两个单一解决方案序列的连接。左侧是:hasDirector
三重模式的解决方案。右侧是空解。叉积只产生一种组合;不可见的连接条件删除了任何具有冲突变量绑定的组合,但这里没有冲突,所以我们保留单个组合。因此,结果是您看到的一个绑定。
您的第二个查询与您的第一个查询不同。它的基本结构是{ {TP1} OPTIONAL {TP2} }
。因此,左连接现在位于两个三元组模式之间,并且在OPTIONAL
.
在您的编辑 3中,您向第二组添加了一个过滤条件,该条件对false
空绑定进行评估。所以空绑定从解序列中移除,现在第二组实际上没有结果。连接现在在一个解决方案序列和一个零解决方案序列之间,这很容易导致没有解决方案。这解释了您的编辑 3。
未绑定: SPARQL 没有NULL
. SPARQL 中的“未绑定”只是变量在特定解决方案中根本不绑定到任何值的条件。SQL 有行和列,所以你有单元格,并且单元格总是有一个值,但这个值可以是特殊值NULL
。SPARQL 有行但没有列;您在结果中看到的“列”SELECT
仅在最后引入以用于演示目的。但在查询评估期间不起作用。在每一行(又名解决方案)中,绑定了零个或多个变量,也就是说,它们被分配了一个值。并且任何其他变量(无限数量)都是未绑定的。
推荐阅读
- selenium - 我可以同时使用 BeautifulSoup 和 Selenium 吗?
- google-cloud-platform - 创建 GCP AI Platform Notebook 实例时出现网络用户访问问题
- sass - 无法安装 SASS 插件
- php - #1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以获取在 ' 附近使用的正确语法
- django-filter - 自定义 DateRangeFilter 未按预期执行
- arrays - 来自 ReactJS 的多附加 Laravel
- excel - 如果空白或非空白,Excel IF 公式具有不同的结果
- asp.net-core - Microsoft.AspNetCore.OData:服务文档的相对 @odata.context 链接
- azure-pipelines - Azure 管道,分支工作,但在批准后无法重新分支
- amazon-elastic-beanstalk - Elastic Beanstalk env.yaml 包含无效密钥