当前位置: 首页 > 面试题库 >

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

涂玉韵
2023-03-14
问题内容

相同的查询在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)给了我同样的错误信息。


问题答案:

这是非法的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



 类似资料:
  • 我使用jena创建了一个用于电子邮件存储的rdf模型。我的thr rdf代码是: 这是我查询rdf模型的代码。在这里,我从命令行获取输入,但是字符串的查询也可以工作... 这显示了查询的工作情况:

  • 这里有一个名为的小本体,由Protégé创建,其中我有类、、、和个体()、()和(也是)。在本体论中,我只声明。 当我在Protégé的DL Query选项卡中请求的实例时,我得到的是(它是,因此是,因此是)。 但当我编写以下SPARQ查询时: 我没有任何例子。当我将替换为时,结果是相同的。只有当我用替换它时,我才会得到所需的结果。 为什么DL查询做推断(允许我获得作为类的实例),而不是SPARQ

  • 他们说现在com.hp.hpl.jena.sparql.Engine.Binding.BindingMap在这个版本中不是一个简单的类,而是一个接口。 如果是这样,那么如何在当前版本中运行sparql查询。请根据我分享的代码给出一个例子。提前道谢。

  • 问题内容: 是否有一个库,可以像JPA中那样以编程方式构建SPARQL查询,或者可以像使用for SQL 一样构建查询? 问题答案: 您可以使用两种方法在Jena中以编程方式构建查询:语法或代数。耶拿维基上有一个介绍。 使用代数,您将执行以下操作: (摘自Wiki页面) 不是(也不是预期的),但是那是其中的一些方式。您而不是AND,而您想要进行OR等。痛点是我的经验中的表达式:您可能想从字符串中解

  • 我在读一本书的时候遇到了这句话: 我是Apache Jena的新手,所以这让我想到这么大的图联合是在内存中发生的吗? 因此,我使用TDB存储我的图,并使用SPARQL查询它们,我想查询“在多个FROM子句中给定的2个特定图的图联合”或“所有命名图的图联合”: 这些联合是否会发生在我的Java代码中的内存中,我使用ARQ查询TDB??

  • 我正在尝试使用rdf4j文档构造SPARQL查询:https://rdf4j.org/documentation/tutorials/sparqlbuilder/ 我是java的新手(和stackoverflow,如果写得不好,很抱歉),但我想我已经包含了正确的开始步骤。我用以下方式实例化了一个选择查询、前缀和变量: URL已被右前缀替换 我试图编写的查询是:选择?在哪里{:team_1:draf