SPARQL 查询图中 "values" 的范围是多少

What is the scope of "values" in SPARQL query graph

我有一个包含许多子查询的查询,其中还包含一些子查询。我想知道 SPARQL 查询中值子句的范围。它是否也下降到子查询?

如果我在子查询中定义了一个 values 子句,并在父查询中使用了相同的变量,那么该变量是否仅具有在子查询中指定的值? (反之亦然?)

我查看了 SPARQL 1.1 spec,但我只找到了以下内容,似乎没有回答我的问题:

A VALUES block of data can appear in a query pattern or at the end of a SELECT query, including a subquery.

SPARQL 子查询从最内层到最外层计算。外部查询中的 values 块对内部查询不可用。例如:

select ?x ?y ?z {
  values ?x { "x" }

  { select (?x as ?y) ("z" as ?z) {} }
}
-----------------
| x   | y | z   |
=================
| "x" |   | "z" |
-----------------

如果 ?x 的值在内部查询中可用,那么 ?y 的值将是 "x", 但事实并非如此。

另一方面,来自子查询中 values 块的绑定可以向外传递,if 它们被选中。例如,在此查询中,子查询绑定 ?x?y,但仅项目 ?x:

select ?x ?y {
  {
    select ?x {
      values ?x { "x" }
      values ?y { "y" }
    }
  }
}
-----------
| x   | y |
===========
| "x" |   |
-----------

官方答案在规范中,但不在关于 values 的部分。它在 18.2.1 Variable Scope 中。这不是最容易遵循的 table,但需要注意的是如下规则:

Group { P1 P2 … } : v is in-scope if it is in-scope in one or more of P1, P2, …

这意味着模式 { ... } 的范围内变量集被定义为出现在 in 中的事物的范围内变量的并集。变量得到 "passed" 向外到他们的封闭形式,而不是相反。

我认为有一个例外,即位于最外层查询之外的 values 块,我认为它与 values 块在最外层的查询中:

select ?x ?y ?yy {
  { select (?y as ?yy) {} }
}
values (?x ?y) { (1 2) }
--------------
| x | y | yy |
==============
| 1 | 2 |    |
--------------