Search code examples
javaspringsparqljena

LiteralImpl cannot be cast to class Resource (LiteralImpl and Resource are in unnamed module of loader 'app' (Jena)


I'm creating a web app (spring + react) that will query an endpoint (selected by the user) with a certain query. For the purposes of this app I'm using jena.

This is the method where I use jena:

@Override
public List<String> save(QueryDto queryDto) {
    Endpoint endpoint = endpointRepository.findById(queryDto.getEndpointId()).orElseThrow(() -> new EndpointNotFoundException(queryDto.getEndpointId()));
    List<String> list = new ArrayList();

  //  String prefix = "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>";
    Query query = new Query(queryDto.getName(),
            queryDto.getContent(),
            endpoint);

    RDFConnection conn = RDFConnectionFactory.connect(endpoint.getUrl());

    String subjectString = queryDto.getContent().split("\\?")[1].split(" ")[0];
    System.out.println("SUBJECT STRING" + subjectString);

    QueryExecution qExec = conn.query(queryDto.getContent()) ; //SELECT DISTINCT ?s where { [] a ?s } LIMIT 100

    ResultSet rs = qExec.execSelect() ;
    /*qExec.close() ;
    conn.close() ;*/
    while (rs.hasNext()) {

        //System.out.println(results.getResourceModel());
        //ResultSetFormatter.out(System.out,results, q);
        QuerySolution qs = rs.next();
        System.out.println("qs: "+qs);

        Resource subject = qs.getResource(subjectString) ;

        System.out.println("Subject: "+subject.toString()) ;
        list.add(subject.toString());
    }


    queryRepository.save(query);
    return list;
}

My app works for the following query: SELECT DISTINCT ?s where { [] a ?s } LIMIT 100 and the selected endpoint being: https://dbpedia.org/

However it doesn't work when I try to query a more complex query:

PREFIX dbr: http://dbpedia.org/resource/# PREFIX dbo: http://dbpedia.org/ontology/# select distinct ?birthName where {dbr:Woody_Allen dbo:birthName ?birthName} LIMIT 100 (the selected endpoint once again being https://dbpedia.org/)

I get the following exception:

SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: class org.apache.jena.rdf.model.impl.LiteralImpl cannot be cast to class org.apache.jena.rdf.model.Resource (org.apache.jena.rdf.model.impl.LiteralImpl and org.apache.jena.rdf.model.Resource are in unnamed module of loader 'app')] with root cause java.lang.ClassCastException: class org.apache.jena.rdf.model.impl.LiteralImpl cannot be cast to class org.apache.jena.rdf.model.Resource (org.apache.jena.rdf.model.impl.LiteralImpl and org.apache.jena.rdf.model.Resource are in unnamed module of loader 'app') at org.apache.jena.sparql.core.QuerySolutionBase.getResource(QuerySolutionBase.java:38) at com.finki.sparql_tool_web_app.service.impl.QueryServiceImpl.save(QueryServiceImpl.java:86) at com.finki.sparql_tool_web_app.web.QueryController.save(QueryController.java:34) at jdk.internal.reflect.GeneratedMethodAccessor66.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) at javax.servlet.http.HttpServlet.service(HttpServlet.java:681) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:94) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:889) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:833)

I have never gotten a similar exception and I couldn't find much about it online either. Any idea how to fix this issue?

If a little explanation of my code (and my app) is needed:

  • I have an entity called Endpoint, that contains the name (ex: dbpedia) and url(ex: https://dbpedia.org/)
  • I also have an entity called Query, that has a name (ex: Query1), content(ex: SELECT DISTINCT ?s where { [] a ?s } LIMIT 100) and the selected endpoint. I can show other parts of the app if any are needed for better understanding.

Edit: I tried the following queries as well and the app works fine for them:

PREFIX dbr: http://dbpedia.org/resource/ SELECT DISTINCT ?s where { [] a ?s } LIMIT 100

PREFIX dbr: http://dbpedia.org/resource/ SELECT DISTINCT ?s where { dbr:Woody_Allen a ?s } LIMIT 100

It is only when I add "dbo:birthName" instead of "a" that it throws an exception.


Solution

  • Resource subject = qs.getResource(subjectString)

    A resource is a URI or a blank node, and is not a literal. The query results include a literal (e.g. string).

    Class RDFNode is the Jena class of all RDF terms that can occur.

    The operation QuerySolution.get(varname) retrieves the RDFNode. The cdoe can then inspect the kind of RDF term

    e.g.

             RDFNode rn = qs.get(subjectString) ;
             if (rn.isLiteral() ) { ... }
             else if (rn.isURIResource() ) { ... }
             else // other cases blank node would presumable be an error