SPARQL:组内外相同变量的绑定

SPARQL: BIND of same variable outside and inside a group

使用BIND有效吗?

# Query 1
SELECT * {
  BIND (<http://ex/p2> as ?p)
  {
    BIND (<http://ex/p1> as ?p)
    ?s ?p ?o
  }
}

当 运行 海龟数据时:

@prefix h: <http://ex/> .
h:s1 h:p1 h:o1 .
h:s2 h:p2 h:o2 .

arq 3.11.0 结果为:

-------------
| p | s | o |
=============
-------------

不会抛出错误(即使使用 --strict 也不会)。 但是删除组或更改顺序确实会出错:

# Query 2
SELECT * {
  BIND (<http://ex/p2> as ?p)
  BIND (<http://ex/p1> as ?p)
  ?s ?p ?o
}

BIND: Variable used when already in-scope: ?p in BIND(<http://ex/p1> AS ?p)

和:

# Query 3
SELECT * {
  {
    BIND (<http://ex/p1> as ?p)
    ?s ?p ?o
  }
  BIND (<http://ex/p2> as ?p)
}

BIND: Variable used when already in-scope: ?p in BIND(<http://ex/p2> AS ?p)

问题:

  1. 查询 1 是否违反 10.1 BIND 规定:

    The variable introduced by the BIND clause must not have been used in the group graph pattern up to the point of use in BIND.

  2. 我读18.2.1 Variable Scope 是在查询 1 中,变量 ?p 在范围内 inside 内部组,因此也在范围内 外部 组。 查询 2 的 arq 错误消息是否也适用于 查询 1?

如果能得到澄清,我将不胜感激。

  1. 否,查询 1 没有违反 BIND 的规则,查询有效。这是因为在 SPARQL 中定义了组的查询评估 inside-out。内部组在外部组之前单独评估。如果内组是自己拿的,在里面使用BIND显然是没问题的,因为?p还没有在组里绑定。在您引用的规范文本中,两个关键部分是:“一定不能使用……在组图模式中……到目前为止在 BIND 中使用。”
  2. In-scope变量需要为组中的每个子句分别确定,或者说,在组中的不同地方,不同的变量在范围内。对于查询 1 中的外部组,在 BIND 之前,没有变量在范围内,因此 BIND 是有效的。在 BIND 之后,?p 在范围内,这就是第二个 BIND 在查询 2 中给出错误的原因。一种思考方式:一个组以空范围开始,并且每个子句都可以为组贡献变量。如果变量已经由前面的子句提供,BIND 可能不会分配该变量。