使用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,其中指出:
BIND子句引入的变量一定不能用于 直到BIND使用点为止的组图模式。
我对18.2.1 Variable Scope的阅读
是查询1中的变量?p
在范围内 inside
内部小组,因此也在该小组的外部范围内。
查询2的arq错误消息是否也适用于
查询1?
我很感谢您进行澄清。
答案 0 :(得分:2)
BIND
的规则,并且该查询有效。这是因为SPARQL中对组的查询评估是由内而外定义的。内部组分别评估,外部组评估。如果内部组是单独使用的,则显然可以使用BIND
,因为?p
尚未绑定在组中。在您引用的规范文本中,两个关键部分是:“一定不要使用... 在组图中使用 ...直到在BIND中使用到点。” BIND
之前,没有变量在范围内,因此BIND
是有效的。在BIND
之后,?p
在范围内,这就是为什么第二个BIND
在查询2中给出错误的原因。一种思考方式:组以空范围开始,并且每个子句都可以为组贡献变量。如果某个变量已由前面的子句提供,则BIND
可能不会分配该变量。