我有一个包含许多子查询的查询,其中也包含一些子查询。我想知道SPARQL查询中values子句的范围。它也归结到子查询吗?
如果我在子查询中定义了values子句,并在父查询中使用了相同的变量,那么该变量是否仅具有子查询中指定的值?(反之亦然?)
我查看了SPARQL 1.1规范,但发现的仅是以下内容,似乎并不能回答我的问题:
VALUES数据块可以出现在查询模式中或SELECT查询(包括子查询)的末尾。
SPARQL子查询从最内部到最外部进行评估。甲值在外部查询块不可用于内查询。举个例子:
select ?x ?y ?z {
values ?x { "x" }
{ select (?x as ?y) ("z" as ?z) {} }
}
-----------------
| x | y | z |
=================
| "x" | | "z" |
-----------------
如果内部查询中有?x的值,则?y的值为“ x”,但没有。
另一方面,如果选择了子查询中来自值块的绑定,则可以将它们向外传递。例如,在此查询中,子查询绑定?x和?y,但仅投影?x:
select ?x ?y {
{
select ?x {
values ?x { "x" }
values ?y { "y" }
}
}
}
-----------
| x | y |
===========
| "x" | |
-----------
官方的答案是在规格中,而不是在部分值上。在18.2.1 Variable Scope中。它不是最容易遵循的表格,但需要注意的是以下规则:
组{P1 P2…}:如果v在P1,P2…中的一个或多个中处于范围内,则为范围内
这意味着模式的范围内变量集{ ... }
被定义为内部出现的事物的范围内变量的并集。变量“向外”传递到其封闭形式,而不是相反。
我认为有一个例外,这是最外层查询之外的值块,我认为与最外层查询内的值块几乎相同:
select ?x ?y ?yy {
{ select (?y as ?yy) {} }
}
values (?x ?y) { (1 2) }
--------------
| x | y | yy |
==============
| 1 | 2 | |
--------------
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句