使用聚合子查询的错误查询评估
Wrong query evaluation with aggregation subquery
请参考Factforge Endpoint执行此查询。子查询没有 return 任何结果。 ?myVar
将投影到包含查询,然后与三元组模式 ?myVar ?p ?o.
连接。但是由于内部 select 没有结果,连接应该没有结果。但是,执行查询时情况并非如此。这不是bug吗?
SELECT
?myVar ?p ?o
WHERE
{
{
SELECT ?myVar
WHERE {
?myVar <http://www.example.com/arbitraryNonExistent> ?xx.
}
GROUP BY ?myVar
}
?myVar ?p ?o.
}
LIMIT 10
这是预期的行为。根据https://www.w3.org/TR/sparql11-query/#aggregateAlgebra是否有GROUP BY:
Group(exprlist, Ω) = { ... | μ in Ω }
我们没有匹配项,那么 Ω 为空,所以:
Group(exprlist, {}) = {}
效果是子查询 returns 一个单独的解决方案,其中 ?myVar 未绑定并且与下一个语句模式的连接匹配 ?myVar 的所有内容。最后你会得到很多关于整个查询的解决方案。
甚至还有一个涵盖确切场景的 W3C SPARQL 一致性测试用例:
https://www.w3.org/2009/sparql/docs/tests/data-sparql11/aggregates/agg-empty-group.rq
https://www.w3.org/2009/sparql/docs/tests/data-sparql11/aggregates/agg-empty-group.srx
还有 http://answers.semanticweb.com/questions/17410/semantics-of-sparql-aggregates 的旧讨论。
请参考Factforge Endpoint执行此查询。子查询没有 return 任何结果。 ?myVar
将投影到包含查询,然后与三元组模式 ?myVar ?p ?o.
连接。但是由于内部 select 没有结果,连接应该没有结果。但是,执行查询时情况并非如此。这不是bug吗?
SELECT
?myVar ?p ?o
WHERE
{
{
SELECT ?myVar
WHERE {
?myVar <http://www.example.com/arbitraryNonExistent> ?xx.
}
GROUP BY ?myVar
}
?myVar ?p ?o.
}
LIMIT 10
这是预期的行为。根据https://www.w3.org/TR/sparql11-query/#aggregateAlgebra是否有GROUP BY:
Group(exprlist, Ω) = { ... | μ in Ω }
我们没有匹配项,那么 Ω 为空,所以:
Group(exprlist, {}) = {}
效果是子查询 returns 一个单独的解决方案,其中 ?myVar 未绑定并且与下一个语句模式的连接匹配 ?myVar 的所有内容。最后你会得到很多关于整个查询的解决方案。
甚至还有一个涵盖确切场景的 W3C SPARQL 一致性测试用例:
https://www.w3.org/2009/sparql/docs/tests/data-sparql11/aggregates/agg-empty-group.rq
https://www.w3.org/2009/sparql/docs/tests/data-sparql11/aggregates/agg-empty-group.srx
还有 http://answers.semanticweb.com/questions/17410/semantics-of-sparql-aggregates 的旧讨论。