SPARQL:在组外部和内部的同一变量的绑定



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绑定哪个说明:

    绑定子句引入的变量不得在 组图模式直到绑定中的使用点。

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

我将感谢澄清。

  1. 不,查询1不违反BIND的规则,并且查询是有效的。这是因为对SPARQL中的组的查询评估是内而外定义的。内部组分别评估,然后在外部组之前进行评估。如果内部组是自行拍摄的,则在其中使用BIND显然可以,因为?p尚未在组中绑定。在您引用的规格文本中,这两个关键部分是:"必须在组图模式中使用……> bind in bind in bind 。">
  2. 需要分别确定一个组中的每个子句,换句话说,在组的不同位置,不同的变量处于范围中。对于查询1中的外部组,在BIND之前,没有任何变量范围,因此BIND是有效的。在BIND之后,?p处于范围中,这就是为什么第二个BIND在查询2中给出错误的原因。一种思考这一点的方法:组以空范围开头,每个条款可能会为组贡献变量。如果变量已经由上一个子句贡献,则BIND可能无法分配该变量。

相关内容

  • 没有找到相关文章

最新更新