带有 COUNT 和 ORDER 的 SPARQL 查询返回奇数结果

Posted

技术标签:

【中文标题】带有 COUNT 和 ORDER 的 SPARQL 查询返回奇数结果【英文标题】:SPARQL query with COUNT and ORDER returns odd result 【发布时间】:2011-04-01 19:25:39 【问题描述】:

以下查询计算商店中的所有三元组

SELECT count(*) where  ?s ?p <http://dbpedia.org/resource/Cat> 

并返回预期结果

http://dbpedia.org/sparql?default-graph-uri=http://dbpedia.org&query=select+count(*)++%3Fs+%3Fp+%3Chttp://dbpedia.org/resource/Cat%3E++&debug=on&timeout=&format=text/html&save=display&fname=

但是,当我第一次尝试时,我不小心留在了 ORDER BY 语句中,例如,

select count(*)  ?s ?p <http://dbpedia.org/resource/Cat>  order by ?s

然后我得到一个很长的结果列表

http://dbpedia.org/sparql?default-graph-uri=http://dbpedia.org&query=select+count(*)++%3Fs+%3Fp+%3Chttp://dbpedia.org/resource/Cat%3E++order+by+%3Fs&debug=on&timeout=&format=text/html&save=display&fname=

谁能解释为什么会出现这种结果以及它的含义?这可能是 Virtuoso SPARQL 实现的错误吗?

【问题讨论】:

考虑在semanticoverflow.com上询问 好的,这似乎是一个 Virtuoso 错误,感谢您的帮助 【参考方案1】:

如果您在不同的商店运行相同类型的查询,它看起来确实像一个错误,即 http://api.talis.com/stores/bbc-backstage/services/sparql (它不会运行 virtuoso)

第一个查询有效...

SELECT (count(?s) as ?c)
WHERE 
?s ?p <http://purl.org/ontology/po/Version> .

第二个……

SELECT (count(?s) as ?c)
WHERE 
?s ?p <http://purl.org/ontology/po/Version> .
 order by ?s

...给出相同的结果。

实际上计数 + 排序在这里没有多大意义,因为 ?s 未被选中进行检索。但正如你所说,你不小心尝试了它......它看起来确实像一个错误。

我的建议是发送电子邮件至virtuoso-user mailing list 通知此问题。

【讨论】:

【参考方案2】:

我们(= OpenLink)在这里遇到了麻烦。这个 ORDER BY ?s 在形式上是查询中的一个错误:没有分组的聚合意味着“聚合所有内容”,在查询的输出端不应该有聚合之外的变量。但是,现在不会报告此错误:违反此规则的情况非常多,以至于 SQL 编译器会进行自动分组,并且我们的 SPARQL-to-SQL 预处理器也会尽可能忽略此错误。

我们可能会保持当前行为不变。如果添加了“严格”​​编译模式,则会在这种情况下触发错误报告。

【讨论】:

【参考方案3】:

这可能是 Virtuoso 的一个错误,它似乎将带有聚合和 ORDER BY 子句的查询视为具有隐式 GROUP BY 子句。除了 DBPedia 之外,我还在其他 Virtuoso 端点上注意到了这一点。

IMO 这是一个错误,您应该按照 msalvadores 的建议将其报告给 Virutoso 用户邮件列表

【讨论】:

以上是关于带有 COUNT 和 ORDER 的 SPARQL 查询返回奇数结果的主要内容,如果未能解决你的问题,请参考以下文章

SPARQL使用带有限制的子查询

SPARQL - 未知的名称空间前缀错误

我正在尝试获取所有拥有超过 3 篇作品的作者的列表 - DBpedia Sparql

使用 WikiData Sparql 高效查询抽象元素

需要帮助对可用的订单明细表进行分组以得出 count(order_line_item) 、 Qty 和 count(Qty) 的分布

按 Id 分组行并将月份和 order_count 连接为列?