Sparql 当通过Jena发布时,计数聚合在DBPedia上不起作用

Sparql 当通过Jena发布时,计数聚合在DBPedia上不起作用,sparql,jena,semantic-web,dbpedia,Sparql,Jena,Semantic Web,Dbpedia,下面是我用来查询dbpediasparql端点的一段代码。查询select count?y,其中{x?y?z.}工作正常,但下面的查询不会运行,并给出变量?count?的错误信息 我认为语法是正确的,谁能指出这里可能的错误是什么 int count=0; String queryStringNew="select count(distinct ?y) where {?x ?y ?z .}"; Query query=QueryFactory.c

下面是我用来查询dbpediasparql端点的一段代码。查询select count?y,其中{x?y?z.}工作正常,但下面的查询不会运行,并给出变量?count?的错误信息

我认为语法是正确的,谁能指出这里可能的错误是什么

        int count=0;

        String queryStringNew="select count(distinct ?y) where {?x ?y ?z .}";

        Query query=QueryFactory.create(queryStringNew);

        ARQ.getContext().setTrue(ARQ.useSAX);
        QueryExecution qexec = QueryExecutionFactory.sparqlService("http://DBpedia.org/sparql", query);

        ResultSet results = qexec.execSelect();



        while(results.hasNext())
        {
            QuerySolution soln=results.nextSolution();
            //System.out.println(soln.get("?x"));
            count++;
        }

使用Jena时,查询字符串的正确语法应为:

String queryStringNew=选择y countdistinct?y,其中{x?y?z.}


选择?y COUNT?y as?yCount

当您使用Jena时,查询字符串的正确语法应该是:

String queryStringNew=选择y countdistinct?y,其中{x?y?z.}


选择?y COUNT?y作为?y COUNT

问题是您的查询不是有效的SPARQL 1.1

用于DBPedia的Virtuoso软件因具有非标准SPARQL实现而臭名昭著,该实现支持在标准SPARQL中无效的各种语法扩展。这就是为什么当您自己直接在DBPedia端点输入查询时,它会被接受

为使SPARQL有效,所有聚合和项目表达式都需要用括号括起来,并使用AS子句作为别名,例如

SELECT ?y (COUNT(DISTINCT ?y) AS ?count) WHERE { ?x ?y ?z }
如果您确实希望通过Jena支持非标准SPARQL,则可以在解析查询时启用扩展语法:

Query q = QueryFactory.create("SELECT ?y COUNT(DISTINCT ?y) WHERE { ?x ?y ?z }", Syntax.syntaxARQ);
请注意,即使启用了该选项,仍然有许多非标准的SPARQL语法构造是Virtuoso支持的,而ARQ仍然会拒绝这些构造


但是,最好尽可能使用标准SPARQL,否则会将查询绑定到特定的实现,并限制查询的可移植性。

问题在于您的查询不是有效的SPARQL 1.1

用于DBPedia的Virtuoso软件因具有非标准SPARQL实现而臭名昭著,该实现支持在标准SPARQL中无效的各种语法扩展。这就是为什么当您自己直接在DBPedia端点输入查询时,它会被接受

为使SPARQL有效,所有聚合和项目表达式都需要用括号括起来,并使用AS子句作为别名,例如

SELECT ?y (COUNT(DISTINCT ?y) AS ?count) WHERE { ?x ?y ?z }
如果您确实希望通过Jena支持非标准SPARQL,则可以在解析查询时启用扩展语法:

Query q = QueryFactory.create("SELECT ?y COUNT(DISTINCT ?y) WHERE { ?x ?y ?z }", Syntax.syntaxARQ);
请注意,即使启用了该选项,仍然有许多非标准的SPARQL语法构造是Virtuoso支持的,而ARQ仍然会拒绝这些构造


但是,最好尽可能使用标准SPARQL,否则会将查询绑定到特定的实现,并限制查询的可移植性。

您能澄清一下吗?我知道一些SPARQL引擎可能无法准确解释规范,它们可能允许一些格式错误的查询,但我想我在您的答案中遗漏了一步。请参阅我懒得键入的聚合解释的答案。但据我所知,Jena也不应该接受select?y countdistinct?y where{?x?y?z.},因为count。。。不被计数就不应该出现。。。像所以我不理解第一个代码块。很好的一点-我一直这样使用它,我假设它在规范中的某个地方。RobV重新使用了看起来相同的语法,所以他可能知道原因。@loopsam他说SELECT?y COUNTDISTINCT?y AS?count…是有效的、标准的、可移植的SPARQL,但是Jena也可以接受SELECT?y COUNTDISTINCT?y…如果启用扩展ARQ语法,那么代码行很长,syntax.syntaxARQ已经过了右边缘;我必须滚动才能看到它。我认为它的要点是:要么使用标准SPARQL,要么,如果OP需要非标准语法,在Jena中启用非标准语法。你能澄清一下吗?我知道一些SPARQL引擎可能无法准确解释规范,它们可能允许一些格式错误的查询,但我想我在您的答案中遗漏了一步。请参阅我懒得键入的聚合解释的答案。但据我所知,Jena也不应该接受select?y countdistinct?y where{?x?y?z.},因为count。。。不被计数就不应该出现。。。像所以我不理解第一个代码块。很好的一点-我一直这样使用它,我假设它在规范中的某个地方。RobV重新使用了看起来相同的语法,所以他可能知道原因。@loopsam他说SELECT?y COUNTDISTINCT?y AS?count…是有效的、标准的、可移植的SPARQL,但是Jena也可以接受SELECT?y COUNTDISTINCT?y…如果启用扩展ARQ语法,那么代码行很长,syntax.syntaxARQ已经过了右边缘;我必须滚动才能看到它。我认为它的要点是:要么使用标准SPARQL,要么,如果OP需要非标准语法,在Jena中启用非标准语法。@RobV的答案是正确的。供日后参考。sparql.orq有一个。如果在文本中粘贴select count DISTINCT?y,其中{x?y?z.},您将得到正确的错误消息“在第1行第8列遇到了count count。我们期望的是:…”即使[您]认为
语法是正确的,检查总是一个好主意。发布从Jena收到的错误消息也很有帮助。我认为这可能是一个解析或语法错误,可能是关键字计数,而不是变量。@RobV的答案是正确的。供日后参考。sparql.orq有一个。如果您在文本中粘贴select COUNTINCT?y,其中{x?y?z.},您将得到正确的错误消息“在第1行第8列遇到了count count。我们希望出现以下情况之一:…”,即使[您]认为语法正确,检查始终是一个好主意。发布从Jena收到的错误消息也很有帮助。我认为这可能是一个解析或语法错误,可能是关键字计数,而不是变量。