简体   繁体   English

使用Apache Jena查询DBPedia时出错

[英]Error while querying DBPedia using Apache Jena

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. 在使用Eclipse-Apache Jena执行上述查询时,出现以下错误。但是,如果在dbpedia sparql virtuso的Web服务页面上触发了相同的查询,则会得到理想的结果。

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. 但是如果在Web上使用DBPedia Virtuso sparql运行相同的查询,则会得到结果。 I am new to Apche jena Please Help!!!! 我是Apche jena的新手,请帮助!!!!

Virtuoso accepts non standard syntax. Virtuoso接受非标准语法。 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. {n,m}语法是关于属性路径的较早提议之一,但并未被SPARQL 1.1标准接受。 As a result, your query isn't actually legal SPARQL 1.1 (or SPARQL 1.0). 结果,您的查询实际上不是合法的SPARQL 1.1(或SPARQL 1.0)。 You can check whether your query is legal with sparql.org's query validator . 您可以使用sparql.org的查询验证器检查查询是否合法。

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. 我认为您也可以使用Jena的API要求它首先验证查询,在这种情况下,您将能够发送查询。 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. 如果使用Jena发送具有Virtuoso特定功能的查询,则需要直接创建QueryEngineHTTP(这是QueryExecution)并仅提供2个字符串(端点和查询字符串)。 Otherwise, Jena validates the query locally but it isn't valid SPARQL hence it fails. 否则,Jena会在本地验证查询,但它不是有效的SPARQL,因此会失败。 AndyS Sep 24 '14 at 10:48 AndyS 2014年 9月24日10:48

or this answers.semanticweb.com question: jena throws QueryParsingException on correct but non-standard SPARQL . 或此answer.semanticweb.com问题: 耶娜(Jena)对正确但非标准的SPARQL抛出QueryParsingException In that question, OP found a solution by creating a QueryEngineHTTP directly, with code like this: 在该问题中,OP通过使用以下代码直接创建QueryEngineHTTP来找到解决方案:

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

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();
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM