使用聚合子查询的错误查询评估

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 一致性测试用例:

还有 http://answers.semanticweb.com/questions/17410/semantics-of-sparql-aggregates 的旧讨论。