带聚合子查询的SPARQL查询结果异常,是否为Bug?
SPARQL子查询无结果时外层连接异常的问题分析
先把你的查询完整整理出来(补全了省略的部分):
SELECT ?myVar ?p ?o WHERE { { SELECT ?myVar WHERE { ?myVar <http://www.example.com/arbitraryNonExistent> ?xx. } GROUP BY ?myVar } ?myVar ?p ?o }
你遇到的情况确实违反直觉:内层子查询因为找不到匹配的三元组,本该返回空结果,按SPARQL标准的内连接逻辑,外层和?myVar ?p ?o连接后也应该是空,但实际执行却有结果——这大概率是Factforge端点的实现Bug,不过我们可以先排查几个可能性:
- 先单独验证内层子查询:运行
SELECT ?myVar WHERE { ?myVar <http://www.example.com/arbitraryNonExistent> ?xx. } GROUP BY ?myVar,确认它确实没有返回任何行。少数SPARQL实现对无结果的GROUP BY可能有特殊处理,但按W3C标准,这里应该是空结果集。 - 检查端点是否错误处理了未绑定变量:如果子查询没有输出?myVar的绑定,外层的
?myVar ?p ?o本该没有匹配(因为?myVar没有值),但如果端点把未绑定的?myVar当作“任意变量”执行,就会返回所有?p ?o的三元组,这显然不符合SPARQL的语义规则。
如果以上排查确认内层确实无结果,而外层仍有输出,那这就是端点的实现问题了,属于Bug。你可以考虑向Factforge的开发团队提交这个问题反馈。
内容的提问来源于stack exchange,提问作者Median Hilal
相关产品推荐
相关产品推荐

