【问题标题】:What is the scope of "values" in SPARQL query graphSPARQL 查询图中“值”的范围是什么
【发布时间】:2016-02-26 01:18:34
【问题描述】:

我有一个包含许多子查询的查询,其中还包含一些子查询。我想知道 SPARQL 查询中 values 子句的范围。是否也涉及子查询?

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

我查看了SPARQL 1.1 spec,但我发现的只是以下内容,这似乎无法回答我的问题:

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

【问题讨论】:

    标签: sparql


    【解决方案1】:

    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 |    |
    --------------
    

    【讨论】:

      猜你喜欢
      • 2016-06-04
      • 2023-03-10
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多