SPARQL中BIND引用VALUES时的语句摆放位置对运行结果的影响疑问
SPARQL中VALUES位置影响BIND生效的原因
核心原理
SPARQL的WHERE子句内的图模式按书写顺序从上到下依次执行,每一步操作都基于当前的结果集处理,不同操作的求值时机差异直接导致了对应的现象。
两种写法的执行差异
- VALUES放在BIND之前
执行顺序如下:- 初始结果集为1行空绑定
- VALUES执行后,结果集新增
?startYear = 2020的绑定,当前结果集为1行:?startYear=2020 - 执行BIND时,
?startYear已经有绑定值,正常计算2020-2得到?year=2018,结果符合预期
- BIND放在VALUES之前
执行顺序如下:- 初始结果集为1行空绑定
- 执行BIND时,
?startYear还未被赋值属于未绑定变量,算术运算未绑定值-2的结果为非法值,不同SPARQL实现对这种非法值的处理不同,就出现了Fuseki返回1、Stardog返回空的差异,此时结果集为1行:?year=非法值 - 后续执行VALUES仅会给当前结果集新增
?startYear=2020的绑定,不会重新计算之前已经生成的?year,因此最终?year的值仍是错误的。
FILTER场景可正常运行的原因
BIND是立即求值操作:执行到BIND语句时必须立刻计算表达式结果生成新变量的绑定,后续新增的变量绑定不会回溯更新之前的BIND结果。
而FILTER是延迟求值的过滤规则:只要FILTER表达式中涉及的变量还没有全部完成绑定,求值逻辑就会延后,直到所有变量都有可用绑定后再计算过滤条件,因此不管VALUES放在FILTER的前面还是后面,只要最终变量有绑定,就能正常完成过滤。
内容的提问来源于stack exchange,提问作者Adrian Gschwend
相关产品推荐
相关产品推荐

