SPARQL 子查询从最里面到最外面进行评估。外部查询中的 values 块对内部查询不可用。举个例子:
select ?x ?y ?z {
values ?x { "x" }
{ select (?x as ?y) ("z" as ?z) {} }
}
-----------------
| x | y | z |
=================
| "x" | | "z" |
-----------------
如果 ?x 的值已在内部查询中可用,则 ?y 将具有值“x”,但不是。 p>
另一方面,子查询中 values 块的绑定可以向外传递,如果它们被选中。例如,在此查询中,子查询绑定 ?x 和 ?y,但仅投射 ?x:
select ?x ?y {
{
select ?x {
values ?x { "x" }
values ?y { "y" }
}
}
}
-----------
| x | y |
===========
| "x" | |
-----------
官方答案在规范中,但不在关于价值观的部分。它位于18.2.1 Variable Scope。这不是最容易遵循的表格,但需要注意的是以下规则:
Group { P1 P2 ... } : 如果 v 在 P1、P2、... 中的一个或多个范围内,则 v 在范围内。
这意味着模式{ ... } 的范围内变量集被定义为出现在其中的事物的范围内变量的联合。变量向外“传递”到它们的封闭形式,反之亦然。
我认为有一个例外,它是位于最外层查询之外的 values 块,我认为它与 values 几乎相同在最外层查询内阻塞:
select ?x ?y ?yy {
{ select (?y as ?yy) {} }
}
values (?x ?y) { (1 2) }
--------------
| x | y | yy |
==============
| 1 | 2 | |
--------------