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

SPARQL:组内外的同一变量绑定,sparql,arq,Sparql,Arq,使用BIND有效吗 # Query 1 SELECT * { BIND (<http://ex/p2> as ?p) { BIND (<http://ex/p1> as ?p) ?s ?p ?o } } 不会抛出错误(即使在使用--strict时也不会)。 但删除组或更改顺序会产生错误: # Query 2 SELECT * { BIND (<http://ex/p2> as ?p) BIND (<http://ex

使用
BIND
有效吗

# Query 1
SELECT * {
  BIND (<http://ex/p2> as ?p)
  {
    BIND (<http://ex/p1> as ?p)
    ?s ?p ?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)
#查询2
选择*{
绑定(as?p)
绑定(as?p)
?s?p?o
}
绑定:已在范围内时使用的变量:绑定中的?p(作为?p)
以及:

#查询3
选择*{
{
绑定(as?p)
?s?p?o
}
绑定(as?p)
}
绑定:已在范围内时使用的变量:绑定中的?p(作为?p)
问题:

  • 查询1是否违反以下状态:

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

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

  • 如能澄清,我将不胜感激

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

  • 我不知道
    BIND
    的顺序很重要,但看起来确实如此,因为这是查询1和查询3之间的唯一区别。有趣的是,应该记住这一点——感谢您的澄清,对于BIND、OPTIONAL和减号,顺序很重要。是的,对于
    OPTIONAL和
    减号,我已经知道了,对于
    BIND,我到目前为止没有问题,或者更好地说,我从来没有用过相同的变量名等等——但老实说,我没有考虑顺序。很高兴知道。但是,不确定这是否是所有人的直觉。当然,
    OPTIONAL
    也一样,我想,当不考虑左连接时。所以我再一次认识到,仔细阅读正式语言的规范是值得的
    -------------
    | p | s | o |
    =============
    -------------
    
    # 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)