【问题标题】:Spring data wth ne04j error...error while retrieving paths带有 ne04j 错误的 Spring 数据...检索路径时出错
【发布时间】:2013-03-13 03:56:15
【问题描述】:

我在 neo4j 中使用 spring 数据。

我使用@Query注解将查询放到repository中,查询如下

@Query(value = "START me=node({0}), friend=node({1}) "
            + "MATCH p=shortestPath(me-[:ACTIVEFRIEND*..]->friend)"
            + " RETURN p")

public Iterable<EntityPath<User, User>> getShortestPathBetween(User a, User b);

在控制器中我访问它

 Iterable<EntityPath<User, User>> shortestPathBetween = this.queryService.getShortestPathBetween(user, friend);
        for (EntityPath<User, User> path : shortestPathBetween) {
            Iterator<User> iter = path.<User>nodeEntities().iterator();
        }

当它尝试访问path.nodeEntities 时,会导致此错误:

嵌套异常是 java.lang.NullPointerException] 的根本原因
java.lang.NullPointerException
在 org.springframework.data.neo4j.support.path.ConvertingEntityPath.nodes(ConvertingEntityPath.java:137)
在 org.springframework.data.neo4j.support.path.ConvertingEntityPath.nodeEntities(ConvertingEntityPath.java:69)
在 com.laindain.cms.controller.QueryController.getShortestPathBetween(QueryController.java:194)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:601) 在 org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1822) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 在 java.lang.Thread.run(Thread.java:722)

如果有人可以帮助我,我将不胜感激。

谢谢 赫曼特

【问题讨论】:

    标签: neo4j spring-data-neo4j


    【解决方案1】:

    尝试以这种方式定义方法:

    public EndResult<EntityPath<User, User>> getShortestPathBetween(User a, User b);
    

    因为查询返回的是路径而不是路径的集合。 可以得到如下结果:

    EntityPath<User, User> shortestPathBetween =
    this.queryService.getShortestPathBetween(user, friend).to(EntityPath);
    

    然后可以使用返回的 EntityPath 上的 nodeEntities()relationshipEntities() 方法访问路径上的节点和关系.

    【讨论】:

    • 感谢 remigio 的回复。有没有其他方法可以通过其他返回数据类型来实现...
    • 我误解了你的问题,我刚刚编辑了我的答案,希望对你有帮助
    • 不知何故这不起作用。 ConvertingEntityPath 中的 delegatenull,因为查询返回 LinkedHashMap 并且无法转换为 Path.class
    猜你喜欢
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多