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