2013-03-31 2 views
0

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

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; 

Где throwQuery

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 

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

ответ

1

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

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

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

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

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

Смежные вопросы