Virtuoso Jena API中的SPARQL查询“COUNT” – QueryParseException

相同的查询适用于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  ?o. ?sa ?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:  ...  ... "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  ?o. ?sa ?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(); } 

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

这是非法的SPARQL语法:

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

它应该是

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

您将遇到的问题是?class in:

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

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

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