![](/img/trans.png)
[英](Neo4j Unmanaged extension API) Why the speed of query depends on the size of dataset in Neo4j?
[英]cypher query on unmanaged extension neo4j
我的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個內部錯誤。 如果我刪除代碼
結果結果= database.execute(“ MATCH(n:KISI)其中id(n)= 1返回n”);
那一切都很好
我檢查了日志文件,錯誤如下
2015年8月13日,上午3:34:36 com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException嚴重:無法將MappableContainerException中包含的異常映射到響應,然后重新拋出到HTTP容器java.lang.NoSuchMethodError: org.neo4j.graphdb.GraphDatabaseService.execute(Ljava /郎/字符串;)Lorg / Neo4j的/ graphdb /結果; 在org.neo4j.examples.server.unmanaged.HelloWorldResource.hello(HelloWorldResource.java:55)在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) .reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at com.sun.jersey.spi.container.JavaMethodInvokerFactory $ 1.invoke(JavaMethodInvokerFactory.java:java.lang.reflect.Method.invoke(Method.java:606) 60)在com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher上的com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider $ ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)處。在org.neo4j.server.rest.transactional.TransactionalRequestDispatcher.dispatch(TransactionalRequestDispatcher.java:139)處com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule)調度(ResourceJavaMethodDispatcher.java:75)。 java:288)在com.sun.jersey.s er.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)位於com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)位於com.sun.jersey。 com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)上的server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)在com.sun.jersey上。 com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)上的server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)。位於com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)上的application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)位於com.sun.jersey.spi.container.servlet.WebComponent處。 com.sun.jersey.spi.container.servle的service(WebComponent.java:416)com.sun.jersey.spi.container.servle的service(ServletContainer.java:537) org上的org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)上的javax.servlet.http.HttpServlet.service(HttpServlet.java:848)上的t.ServletContainer.service(ServletContainer.java:699) org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:211)上的.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505)org.eclipse.jetty.server.handler.ContextHandler org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432)的.doHandle(ContextHandler.java:1096)org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)的.doHandle(ContextHandler.java:1096) org.eclipse.jetty.server上的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.HandlerWrapper.handle(HandlerWrapper.java:97)處的handler.HandlerList.handle(HandlerList.java:52)org.eclipse.jetty.server.Server.handle(Server.java: 445),網址為org.eclipse。 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229)上的jetty.server.HttpChannel.handle(HttpChannel.java:268)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)
那我的代碼怎么了?
我猜您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
文件的構建方式。
provided
(Neo4j發行版中已經存在)。 GraphDatabaseService::execute
方法是最近發明的(如果我沒記錯的話,請GraphDatabaseService::execute
2.2.3)。 可能您的數據庫發行版比您的Maven依賴項還舊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.