SPARQL:组内外相同变量的绑定
SPARQL: BIND of same variable outside and inside a group
使用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 BIND 规定:
The variable introduced by the BIND clause must not have been used in
the group graph pattern up to the point of use in BIND.
我读18.2.1 Variable Scope
是在查询 1 中,变量 ?p
在范围内 inside
内部组,因此也在范围内 外部 组。
查询 2 的 arq 错误消息是否也适用于
查询 1?
如果能得到澄清,我将不胜感激。
- 否,查询 1 没有违反
BIND
的规则,查询有效。这是因为在 SPARQL 中定义了组的查询评估 inside-out。内部组在外部组之前单独评估。如果内组是自己拿的,在里面使用BIND
显然是没问题的,因为?p
还没有在组里绑定。在您引用的规范文本中,两个关键部分是:“一定不能使用……在组图模式中……到目前为止在 BIND 中使用。”
- In-scope变量需要为组中的每个子句分别确定,或者说,在组中的不同地方,不同的变量在范围内。对于查询 1 中的外部组,在
BIND
之前,没有变量在范围内,因此 BIND
是有效的。在 BIND
之后,?p
在范围内,这就是第二个 BIND
在查询 2 中给出错误的原因。一种思考方式:一个组以空范围开始,并且每个子句都可以为组贡献变量。如果变量已经由前面的子句提供,BIND
可能不会分配该变量。
使用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 BIND 规定:
The variable introduced by the BIND clause must not have been used in the group graph pattern up to the point of use in BIND.
我读18.2.1 Variable Scope 是在查询 1 中,变量
?p
在范围内 inside 内部组,因此也在范围内 外部 组。 查询 2 的 arq 错误消息是否也适用于 查询 1?
如果能得到澄清,我将不胜感激。
- 否,查询 1 没有违反
BIND
的规则,查询有效。这是因为在 SPARQL 中定义了组的查询评估 inside-out。内部组在外部组之前单独评估。如果内组是自己拿的,在里面使用BIND
显然是没问题的,因为?p
还没有在组里绑定。在您引用的规范文本中,两个关键部分是:“一定不能使用……在组图模式中……到目前为止在 BIND 中使用。” - In-scope变量需要为组中的每个子句分别确定,或者说,在组中的不同地方,不同的变量在范围内。对于查询 1 中的外部组,在
BIND
之前,没有变量在范围内,因此BIND
是有效的。在BIND
之后,?p
在范围内,这就是第二个BIND
在查询 2 中给出错误的原因。一种思考方式:一个组以空范围开始,并且每个子句都可以为组贡献变量。如果变量已经由前面的子句提供,BIND
可能不会分配该变量。