SPARQL parse error with Jena, but DBpedia accepts

2020-05-08 08:00发布

I'm using Jena to launch a SPARQL query. I have this code, which produces an error. I don't understand the reason for this error, since putting the query into the DBpedia SPARQL endpoint works! I think that I wrote the query string correctly. What's the error?

Code

 String sparqlQueryString=
 "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> "+
 "select ?sub ?super (count(?mid) as ?length) where {"+
 "values ?sub { <http://dbpedia.org/ontology/Writer> }" +
 "?sub rdfs:subClassOf* ?mid ."+
 "?mid rdfs:subClassOf+ ?super .}"+
 "group by (?sub ?super)"+
 "order by (?length)";
 query = QueryFactory.create(sparqlQueryString); 
 QueryExecution qexec = 
 QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql",query);

Error

Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered "     
<VAR1> "?super "" at line 1, column 231.
Was expecting one of:
"not" ...
"as" ...
"in" ...
<INTEGER_POSITIVE> ...
<DECIMAL_POSITIVE> ...
<DOUBLE_POSITIVE> ...
<INTEGER_NEGATIVE> ...
<DECIMAL_NEGATIVE> ...
<DOUBLE_NEGATIVE> ...
")" ...
"=" ...
"!=" ...
">" ...
"<" ...
"<=" ...
">=" ...
"||" ...
"&&" ...
"+" ...
"-" ...
"*" ...
"/" ...
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:156)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:79)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:52)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:40)
at Query.QueryRDF.retrieveSuperClasses(QueryRDF.java:87)
at Query.QueryRDF.main(QueryRDF.java:144)

标签: java sparql jena
1条回答
男人必须洒脱
2楼-- · 2020-05-08 08:32

Dont' put parentheses around the GROUP BY variables. That is, it should be group by ?sub ?super, and not group by (?sub ?super). This is pretty clear if you add newlines with \n to your query, so that it's easier to see where the error is. E.g., when I try to compile the following code, I get the following run time error.

import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;

public class ParseError {
    @SuppressWarnings("unused")
    public static void main(String[] args) {
         String sparqlQueryString=
                 "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n"+
                 "select ?sub ?super (count(?mid) as ?length) where {\n"+
                 "values ?sub { <http://dbpedia.org/ontology/Writer> }\n" +
                 "?sub rdfs:subClassOf* ?mid .\n"+
                 "?mid rdfs:subClassOf+ ?super .}\n"+
                 "group by (?sub ?super)\n"+
                 "order by (?length)\n";
         Query query = QueryFactory.create(sparqlQueryString); 
         QueryExecution qexec = 
                 QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql",query);
    }
}

Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " "?super "" at line 6, column 16.

The error points right to the problematic line. Parentheses aren't needed here, as the GroupClause production in the grammar expects one or more GroupConditions, which have a form defined by this production:

GroupCondition ::= BuiltInCall | FunctionCall | '(' Expression ( 'AS' Var )? ')' | Var

If there's a GROUP BY (...) it's supposed to be something like

GROUP BY ( ?a+?b )
GROUP BY ( ?a+?b as ?abSum )

You could also have tested this by pasting your query

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
select ?sub ?super (count(?mid) as ?length) where {
values ?sub { <http://dbpedia.org/ontology/Writer> }
?sub rdfs:subClassOf* ?mid .
?mid rdfs:subClassOf+ ?super .}
group by (?sub ?super)
order by (?length)

into sparql.org's query validator from which you'd get the output:

Input:

  1 PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
  2 select ?sub ?super (count(?mid) as ?length) where {
  3 values ?sub { <http://dbpedia.org/ontology/Writer> }
  4 ?sub rdfs:subClassOf* ?mid .
  5 ?mid rdfs:subClassOf+ ?super .}
  6 group by (?sub ?super)
  7 order by (?length)

Syntax Error

Encountered "  "?super "" at line 6, column 16.
Was expecting one of:
    "not" ...
    "as" ...
    "in" ...
     ...
查看更多
登录 后发表回答