cypher查询非托管扩展neo4j

时间:2015-08-13 07:03:25

标签: java neo4j cypher

我的neo4j服务器有一个非托管扩展。

以及如下代码。

@Path("/helloworld")
public class HelloWorldResource {

    private final GraphDatabaseService database;

    public HelloWorldResource(@Context GraphDatabaseService database) {
        this.database = database;
    }

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{nodeId}")
   public Response hello(@PathParam("nodeId") long nodeId) {
        String res = ""; 

        try ( Transaction ignored = database.beginTx();)
        {
            //@@problem
            Result result = database.execute( "MATCH (n:KISI) where id(n)=1 return n" );

        } catch (Exception e) {
            res = "Error = " + e.getMessage();
        }

        return Response
            .status(Status.OK)
            .entity(("nodeId =" + nodeId + " " + res).getBytes(Charset
                    .forName("UTF-8"))).build();
    }
}

当我部署代码时,我得到500内部错误。 如果我删除代码

  

结果result = database.execute(“MATCH(n:KISI),其中id(n)= 1返回   n“);

然后一切都很好。

我检查了日志文件,错误如下

  

2015年8月13日上午3:34:36 com.sun.jersey.spi.container.ContainerResponse   mapMappableContainerException SEVERE:包含在其中的异常   MappableContainerException无法映射到响应,   重新投掷到HTTP容器   java.lang.NoSuchMethodError:   org.neo4j.graphdb.GraphDatabaseService.execute(Ljava /郎/字符串;)Lorg / Neo4j的/ graphdb /结果;     在   org.neo4j.examples.server.unmanaged.HelloWorldResource.hello(HelloWorldResource.java:55)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:606)at   com.sun.jersey.spi.container.JavaMethodInvokerFactory $ 1.invoke(JavaMethodInvokerFactory.java:60)     在   com.sun.jersey.server.impl.model.method.dispatch.Abs​​tractResourceMethodDispatchProvider $ ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)     在   com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)     在   org.neo4j.server.rest.transactional.TransactionalRequestDispatcher.dispatch(TransactionalRequestDispatcher.java:139)     在   com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)     在   com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)     在   com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)     在   com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)     在   com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)     在   com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)     在   com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)     在   com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)     在   com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)     在   com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)     在   com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)     在   com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:848)at   org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)     在   org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505)     在   org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:211)     在   org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1096)     在   org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432)     在   org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)     在   org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1030)     在   org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)     在   org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52)     在   org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)     在org.eclipse.jetty.server.Server.handle(Server.java:445)处   org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:268)at at   org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229)     在   org.eclipse.jetty.io.AbstractConnection $ ReadCallback.run(AbstractConnection.java:358)     在   org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)     在   org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run(QueuedThreadPool.java:532)     在java.lang.Thread.run(Thread.java:745)

我的代码怎么了?

1 个答案:

答案 0 :(得分:4)

我猜你的pom.xml中的Neo4j发行版和maven依赖版本不一样。

但有几件事需要检查:

1)您应该始终关闭Result对象。 例如:

try(Result result = database.execute( "MATCH (n:KISI) where id(n)=1 return n" )) {
    // do stuff here
}

```

2)异常不在try-catch但后来发生。您应该将代码更改为:

try ( Transaction tx = database.beginTx()) {
    String query = "MATCH (n:KISI) where id(n)=1 return n";
    // use result with try-with-resource to ensure that it will be closed
    try(Result result = database.execute(query)) {
        // do stuff you need with result here
        return Response.ok("nodeId =" + nodeId).build();
    }

    tx.success(); // mark transaction as successful 
} catch (Exception e) {
    // If exception occurs - send exception message with 500 status code
    // It's good idea to write Exception stacktrace to log there
    return Response.serverError().entity(e.getMessage()).build()      
}

3)您应该检查如何构建非托管扩展.jar文件。

  • 所有Neo4j依赖项应该是pom.xml中的provided(在Neo4j发行版中已有)。
  • 检查pom.xml中的数据库版本和依赖项版本是否相同。最近发明了GraphDatabaseService::execute方法(2.2.3,如果我没记错的话)。可能您的数据库分发比maven依赖项旧。