SPARQL查询图中"值"的范围是什么

Wil*_*aan 4 sparql

我有一个包含许多子查询的查询,其中还包括一些子查询.我想知道SPARQL查询中的values子句的范围.它是否也归结为子查询?

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

我查看了SPARQL 1.1规范,但我发现以下内容,似乎没有回答我的问题:

VALUES数据块可以出现在查询模式中或SELECT查询的末尾,包括子查询.

Jos*_*lor 8

SPARQL子查询从最里面到最外面进行评估.甲在外部查询块不可用于内查询.举个例子:

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

  { select (?x as ?y) ("z" as ?z) {} }
}
Run Code Online (Sandbox Code Playgroud)
-----------------
| x   | y | z   |
=================
| "x" |   | "z" |
-----------------
Run Code Online (Sandbox Code Playgroud)

如果?x的值在内部查询中可用,则?y将具有值"x",但它不具有值.

另一方面,如果选择了子查询中的块的绑定,则可以向外传递.例如,在此查询中,子查询绑定?x?y,但仅绑定项目?x:

select ?x ?y {
  {
    select ?x {
      values ?x { "x" }
      values ?y { "y" }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
-----------
| x   | y |
===========
| "x" |   |
-----------
Run Code Online (Sandbox Code Playgroud)

官方答案在规范中,但不在关于价值观的部分.它在18.2.1变量范围内.这不是最容易遵循的表格,但需要注意的是:

组{P1 P2 ...}:如果在P1,P2,...中的一个或多个范围内,则v是范围内的...

这意味着模式的范围内变量集{ ... }被定义为出现在其中的事物的范围内变量的并集.变量被"传递"到它们的封闭形式,而不是相反.

我认为有一个例外,它是一个超出最外层查询的块,我认为它与最外层查询中的块几乎相同:

select ?x ?y ?yy {
  { select (?y as ?yy) {} }
}
values (?x ?y) { (1 2) }
Run Code Online (Sandbox Code Playgroud)
--------------
| x | y | yy |
==============
| 1 | 2 |    |
--------------
Run Code Online (Sandbox Code Playgroud)