带有 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 查询返回奇数结果的主要内容,如果未能解决你的问题,请参考以下文章
我正在尝试获取所有拥有超过 3 篇作品的作者的列表 - DBpedia Sparql
需要帮助对可用的订单明细表进行分组以得出 count(order_line_item) 、 Qty 和 count(Qty) 的分布