4

使用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,其中规定:

    BIND 子句引入的变量在 BIND 中使用之前不得在组图模式中使用。

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

我将不胜感激。

4

1 回答 1

2
  1. 不,查询 1 不违反 的规则BIND,查询有效。这是因为 SPARQL 中组的查询评估是由内而外定义的。内部组单独评估,并在外部组之前进行。如果内组单独取,BINDin it 的使用显然没问题,因为?p还没有绑定在组内。在您引用的规范文本中,两个关键部分是:“在组图模式中……直到BIND 中的使用点之前都不能使用。”</li>
  2. 需要为组中的每个子句单独确定范围内变量,或者换句话说,在组中的不同位置,不同的变量在范围内。对于查询 1 中的外部组,在 之前BIND,没有变量在范围内,因此BIND是有效的。之后BIND?p在范围内,这就是为什么第二个BIND在查询 2 中给出错误的原因。考虑这一点的一种方法:一个组从一个空范围开始,每个子句都可能为该组贡献变量。如果变量已经由前面的子句提供,BIND则不能分配该变量。
于 2019-05-14T15:38:47.890 回答