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)
Dont' put parentheses around the
GROUP BY
variables. That is, it should begroup by ?sub ?super
, and notgroup 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.The error points right to the problematic line. Parentheses aren't needed here, as the
GroupClause
production in the grammar expects one or moreGroupCondition
s, which have a form defined by this production:If there's a
GROUP BY (...)
it's supposed to be something likeYou could also have tested this by pasting your query
into sparql.org's query validator from which you'd get the output: