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

时间:2019-05-14 11:51:21

标签: sparql arq

使用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 Variable Scope的阅读 是查询1中的变量?p在范围内 inside 内部小组,因此也在该小组的外部范围内。 查询2的arq错误消息是否也适用于 查询1?

我很感谢您进行澄清。

1 个答案:

答案 0 :(得分:2)

  1. 否,查询1不违反BIND的规则,并且该查询有效。这是因为SPARQL中对组的查询评估是由内而外定义的。内部组分别评估,外部组评估。如果内部组是单独使用的,则显然可以使用BIND,因为?p尚未绑定在组中。在您引用的规范文本中,两个关键部分是:“一定不要使用... 在组图中使用 ...直到在BIND中使用到点。”
  2. 需要分别为组中的每个子句确定范围内变量,或者换句话说,在组中的不同位置确定范围内的变量。对于查询1中的外部组,在BIND之前,没有变量在范围内,因此BIND是有效的。在BIND之后,?p在范围内,这就是为什么第二个BIND在查询2中给出错误的原因。一种思考方式:组以空范围开始,并且每个子句都可以为组贡献变量。如果某个变量已由前面的子句提供,则BIND可能不会分配该变量。