首页 文章

使用COUNT和ORDER的SPARQL查询返回奇数结果

提问于
浏览
5

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

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实现的错误吗?

3 回答

  • 1

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

    第一个查询有效......

    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 来检索 . 但正如你所说,你不小心尝试了......它确实看起来像一个bug .

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

  • 5

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

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

  • 3

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

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

相关问题