【问题标题】:SPARQL Query "COUNT" in Virtuoso Jena API - QueryParseExceptionVirtuoso Jena API 中的 SPARQL 查询“COUNT” - QueryParseException
【发布时间】:2015-09-23 04:28:31
【问题描述】:

相同的查询在 DBpedia Endpoint(http://ko.dbpedia.org/sparql) 中有效,但在我的 Java 代码中无效。 我只是想用“COUNT”函数提取频率。

VirtGraph set = new VirtGraph("http://ko.dbpedia.org", HOST, USERNAME, PASSWORD);
Query freqsparql = QueryFactory.create("SELECT ?class count(distinct ?s) as ?count where{?s <http://ko.dbpedia.org/property/이름> ?o. ?s a ?class.} order by DESC(?count)");
VirtuosoQueryExecution freqvqe = VirtuosoQueryExecutionFactory.create(freqsparql, set);
ResultSet freqresults = freqvqe.execSelect();

而且报错如下。

Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " "count" "count "" at line 1, column 15.
Was expecting one of:
<VAR1> ...
<VAR2> ...
"from" ...
"where" ...
"(" ...
"{" ...

at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.perform(ParserSPARQL11.java:102)
at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.parse$(ParserSPARQL11.java:53)
at com.hp.hpl.jena.sparql.lang.SPARQLParser.parse(SPARQLParser.java:37)
at com.hp.hpl.jena.query.QueryFactory.parse(QueryFactory.java:148)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:80)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:53)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:41)

我正在使用 virt_jena2.jar 和 virtjdbc4.jar。 我已经查看了类似的问题和答案(Jena ARQ 扩展和 SPARQL 1.1 支持此聚合查询 - 但我找不到如何更改它 - 我认为我正在使用 SPARQL1.1,因为错误消息包含 PARSERSPARQL11。 java ),但目前无法弄清楚如何解决这个问题。

提前致谢。


String sparqlQueryString = "SELECT ?class count(distinct ?s) as ?count    where{?s <http://ko.dbpedia.org/property/이름> ?o. ?s a ?class.} order by DESC(?count)";
Query query = QueryFactory.create(sparqlQueryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService(
                "http://ko.dbpedia.org/sparql", query);
try {
    ResultSet results = qexec.execSelect();
    while(results.hasNext()){
        QuerySolution freqresult = results.nextSolution();
        RDFNode domain = freqresult.get("class");
        RDFNode freqcount = freqresult.get("count");
        System.out.println(freqresult);
        System.out.println(domain + "---" + freqcount);
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    qexec.close();
}

这个耶拿代码(没有 Virtuoso)给了我同样的错误信息。

【问题讨论】:

    标签: java count sparql jena


    【解决方案1】:

    这是非法的 SPARQL 语法:

    SELECT ... count(distinct ?s) as ?count where
    

    应该是

    SELECT ... (count(distinct ?s) as ?count) where
    

    你会遇到?class 的问题:

    SELECT ?class (count(distinct ?s) as ?count) where
    

    因为它不是一个分组变量(使用count 你有一组所有东西)。你的意思是GROUP BY ?class

    【讨论】:

    • 谢谢@AndyS,它正在工作。我忘了放支持轻松查询的GROUP BY ?class Endpoint 环境,让我在生成正确的查询时感到困惑。 SELECT ?class (count(distinct ?s) as ?count) where{?s &lt;http://ko.dbpedia.org/property/이름&gt; ?o. ?s a ?class.} group by ?class order by DESC(?count)
    • 再次访问这里......我用谷歌搜索了我自己的问题......大声笑:)
    【解决方案2】:

    关键字是Encountered " "count" "COUNT ""

    【讨论】:

      猜你喜欢
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多