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)
问题:
?p
在范围内
内部组,因此也在组外的范围内。
查询2的arq错误消息是否也适用于
问题1BIND
的规则,并且该查询有效。这是因为SPARQL中组的查询计算是由内而外定义的。内部组在外部组之前单独进行评估。如果内部组是单独使用的,则在其中使用BIND
显然是好的,因为?p
尚未在组中绑定。在您引用的规范文本中,有两个关键部分是:“必须在组图模式中使用…。。直到在绑定中使用时为止。”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)