Error while querying DBPedia using Apache Jena

2019-06-12 17:42发布

问题:

import java.sql.ResultSet;
import java.sql.SQLException;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSetFormatter;

public class sparq {
    public static void main (String[] args) throws SQLException
{

    String queryString=
            "PREFIX dbpedia: <http://dbpedia.org/resource/>"+
            "PREFIX category: <http://dbpedia.org/resource/Category:>"+
            "PREFIX skos: <http://www.w3.org/2004/02/skos/core#>"+
            "PREFIX dcterms: <http://purl.org/dc/terms/>"+
            "select distinct ?super where {"+
                  "?super (^skos:broader){0,4} category:Nationalist_parties, category:New_Delhi"+
                "}";



            // now creating query object

            com.hp.hpl.jena.query.Query query = QueryFactory.create(queryString);
            // initializing queryExecution factory with remote service.
            // **this actually was the main problem I couldn't figure out.**
            QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);


            //after it goes standard query execution and result processing which can
            // be found in almost any Jena/SPARQL tutorial.
            try {
                com.hp.hpl.jena.query.ResultSet results = qexec.execSelect();
                while(results.hasNext())
                {
                    QuerySolution s=results.nextSolution();
                    String strg=s.getResource("?x").toString();
                    System.out.println(strg);
                }
                //ResultSetFormatter.out(System.out, results, query);  
            }
            finally {
               qexec.close();
            }

}
}

While Executing the above query using Eclipse-Apache Jena,I get the following ERROR.But if the same query is fired on webservice page of dbpedia sparql virtuso, It gives a desired result.

log4j:WARN No appenders could be found for logger (org.apache.jena.riot.system.stream.JenaIOEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " "{" "{ "" at line 1, column 249.
Was expecting one of:
    <IRIref> ...
    <PNAME_NS> ...
    <PNAME_LN> ...
    <BLANK_NODE_LABEL> ...
    <VAR1> ...
    <VAR2> ...
    "true" ...
    "false" ...
    <INTEGER> ...
    <DECIMAL> ...
    <DOUBLE> ...
    <INTEGER_POSITIVE> ...
    <DECIMAL_POSITIVE> ...
    <DOUBLE_POSITIVE> ...
    <INTEGER_NEGATIVE> ...
    <DECIMAL_NEGATIVE> ...
    <DOUBLE_NEGATIVE> ...
    <STRING_LITERAL1> ...
    <STRING_LITERAL2> ...
    <STRING_LITERAL_LONG1> ...
    <STRING_LITERAL_LONG2> ...
    "(" ...
    <NIL> ...
    "[" ...
    <ANON> ...
    "+" ...
    "*" ...
    "/" ...
    "|" ...
    "?" ...

    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)
    at sparq.main(sparq.java:49)

But If the same query runs on using DBPedia Virtuso sparql on web.It gives the result. I am new to Apche jena Please Help!!!!

回答1:

Virtuoso accepts non standard syntax. The {n,m} syntax was in one of the earlier proposals for property paths, but it did not get accepted into the SPARQL 1.1 standard. As a result, your query isn't actually legal SPARQL 1.1 (or SPARQL 1.0). You can check whether your query is legal with sparql.org's query validator.

I think you can also use Jena's API to ask it to not validate the query first, in which case you'll be able to send your query. See, for instance, this comment:

If you are using Jena to send a query with Virtuoso-specific features, you need to direct create a QueryEngineHTTP (which is a QueryExecution) and provide just the 2 strings, endpoint and query string. Otherwise, Jena validates the query locally but it isn't valid SPARQL hence it fails. — AndyS Sep 24 '14 at 10:48

or this answers.semanticweb.com question: jena throws QueryParsingException on correct but non-standard SPARQL. In that question, OP found a solution by creating a QueryEngineHTTP directly, with code like this:

QueryEngineHTTP qe = new QueryEngineHTTP("http://dbpedia.org/sparq","select ...");
ResultSet rs = qe.execSelect();


回答2:

I found the solution to the problem as

void std_query()
    {
        String query = "select distinct ?super where {?super (^skos:broader){0,3} category:Nationalist_parties, category:New_Delhi}";
        QueryEngineHTTP qe = new QueryEngineHTTP("http://dbpedia.org/sparql", query);

        try {
            com.hp.hpl.jena.query.ResultSet results = qe.execSelect();
            while(results.hasNext())
            {
                QuerySolution s=results.nextSolution();
                String strg=s.getResource("?super").toString();
                System.out.println("########### Standard Sparql Result #########");
                System.out.println(strg);
            }
            //ResultSetFormatter.out(System.out, results, query);  
        }
        finally {
           qe.close();
        }
    }