Исключение получения результатов в jena resultSet

У меня возникли проблемы при запросе DBpedia через Jena. Исключение возникает при переборе результирующего набора в методе nextSolution. Вот код:

ResultSet results = throwQuery(query);
ArrayList<Movies> movs = new ArrayList<Movies>();
//try {
    while (results.hasNext()) {
    try{
    QuerySolution q = results.nextSolution();


    Movies m = new Movies();
    m.setUrl(q.get("film_url").toString());
    RDFNode node = q.get("film_label");
    // Set a default title
    String title = "";
    if (node != null) {
        // We delete the "@en" part that indicates that the label is in
        // english
        title = node.toString();
        int ind = title.indexOf("@en");
        title = title.substring(0, ind);
    }
    m.setTitle(title);

    node = q.get("image_url");
    // Set a default image
    String image = "http://4.bp.blogspot.com/_rY0CJheAaRM/SuYJcVOqKbI/AAAAAAAAA2Y/abClDm72TuY/s320/NoCoverAvailable.png";
    if (node != null) {
        // For some reason the image link retrieved from dbpedia is
        // broken. Here we fix it 
        image = node.toString();
        int ind = image.indexOf("common");
        image = image.substring(0, ind) + "en" + image.substring(ind + 7);
    }
    m.setImageurl(image);

    movs.add(m);
    }
    catch(Exception e){
        System.err.println("Error catched: " + e.getMessage());
    }
    }

return movs;

Где бросить запрос

private final static String SERVICE = "http://dbpedia.org/sparql";

private static ResultSet throwQuery(String q) {
Query qFactory = QueryFactory.create(q);
QueryExecution qe = QueryExecutionFactory.sparqlService(SERVICE, qFactory);
ResultSet results = null;
try {
    results = qe.execSelect();
} catch (QueryExceptionHTTP e) {
    System.out.println(e.getMessage());
    System.out.println(SERVICE + " is DOWN");
} finally {
    qe.close();
    return results;
}
}

И тестовый запрос

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?film_label ?image_url ?film_url
WHERE {
?film_url rdf:type <http://dbpedia.org/ontology/Film> .
OPTIONAL{ 
    ?film_url rdfs:label ?film_label 
    FILTER (LANG(?film_label) = 'en')
}
OPTIONAL{   
    ?film_url foaf:depiction ?image_url 
}
FILTER regex(str(?film_url), "hola","i") 
}
ORDER BY ?film_url

Когда программа начинает повторяться, все идет хорошо, пока не будет достигнуто значение Nicholas Nickleby (2002 film), тогда я получаю это исключение:

com.hp.hpl.jena.sparql.resultset.ResultSetException: XMLStreamException: Unexpected EOF in start tag
at [row,col {unknown-source}]: [67,116]
at     com.hp.hpl.jena.sparql.resultset.XMLInputStAX$ResultSetStAX.staxError(XMLInputStAX.java:539    )
at com.hp.hpl.jena.sparql.resultset.XMLInputStAX$ResultSetStAX.hasNext(XMLInputStAX.java:236)
at client.DBPediaConnector.getMovie(DBPediaConnector.java:67)
at customServices.MoviesService.searchInsertMovie(MoviesService.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5360)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)
... 47 more
Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in start tag
at [row,col {unknown-source}]: [67,116]
at com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:677)
at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:1034)
at com.ctc.wstx.sr.StreamScanner.getNextChar(StreamScanner.java:785)
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2790)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1065)
at com.hp.hpl.jena.sparql.resultset.XMLInputStAX$ResultSetStAX.getOneSolution(XMLInputStAX.java:435)
at com.hp.hpl.jena.sparql.resultset.XMLInputStAX$ResultSetStAX.hasNext(XMLInputStAX.java:232)
... 71 more

Мне кажется, это внутренняя ошибка Йены, но я понятия не имею. Я делаю что-то неправильно? Как я могу это решить?


person gpupu    schedule 31.03.2013    source источник


Ответы (1)


Пожалуйста, приведите полный, минимальный пример. Это довольно долго.

DBpedia возвращает поврежденный XML для результатов, возможно, из-за того, что выполнение запроса занимает много времени и инициируется тайм-аут. Кажется, это умеренно медленный запрос.

Попробуйте добавить &timeout=60000 к URL запроса 'http://dbpedia.org/sparql&timeout=60000', если ваша версия Jena достаточно новая. Это может быть недостаточно долго. В dbpedia существует жесткое внутреннее ограничение, которое нельзя обойти.

Выполнение в другое время дня также может помочь.

Это также может быть связано с тем, что возвращается поврежденный XML. Выполните запрос в пользовательском интерфейсе DBpedia и получите результаты XML, чтобы проверить это.

person AndyS    schedule 01.04.2013