我的查询包含许多子查询,其中还包括一些子查询。我想知道SPARQL查询中的values子句的范围。它是否也归结为子查询?
如果我在子查询中定义了一个values子句,并在父查询中使用了相同的变量,那么该变量是否只具有子查询中指定的值? (反过来呢?)
我看了SPARQL 1.1 spec,但我找到的只是以下内容,它似乎没有回答我的问题:
VALUES数据块可以出现在查询模式中或SELECT查询的末尾,包括子查询。
答案 0 :(得分:8)
从最内层到最外层评估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 ...}:如果在P1,P2,......中的一个或多个范围内,则v是范围内的。
这意味着模式{ ... }
的范围内变量集被定义为出现在其中的事物的范围内变量的并集。变量被“传递”到它们的封闭处形式,而不是相反。
有一个例外,我认为,这是一个值块,它位于最外层查询之外,我认为这与值几乎相同在最外面的查询中阻止:
select ?x ?y ?yy {
{ select (?y as ?yy) {} }
}
values (?x ?y) { (1 2) }
--------------
| x | y | yy |
==============
| 1 | 2 | |
--------------