我有一个用例,我需要在neo4j中的并行线程中运行我的存储过程。我编写了存储过程并将其包含在neo4j插件中。但是当我运行存储过程时,我得到了以下错误:
2016-06-24 05:45:54.683+0000 INFO Remote interface available at http://localhost:7474/
java.lang.UnsupportedOperationException: Creating new transactions and/or spawning threads are not supported operations in store procedures.
at org.neo4j.kernel.impl.proc.ProcedureGDBFacadeSPI.assertSameThread(ProcedureGDBFacadeSPI.java:108)
at org.neo4j.kernel.impl.proc.ProcedureGDBFacadeSPI.isInOpenTransaction(ProcedureGDBFacadeSPI.java:124)
at org.neo4j.kernel.impl.factory.GraphDatabaseFacade.beginTransaction(GraphDatabaseFacade.java:335)
at org.neo4j.kernel.impl.factory.GraphDatabaseFacade.beginTx(GraphDatabaseFacade.java:330)
at example.SearchTask.call(SearchTask.java:33)
at example.SearchTask.call(SearchTask.java:17)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
我已经明白,在neo4j中,自定义存储过程无法在并行线程中运行。
但我在寻找有什么方法可以并行运行它。
答案 0 :(得分:5)
使用时
@Context
GraphDatabaseService graphDb
您将获得一个不允许显式事务/线程管理的包装GDS。如果您需要在过程中执行此操作,则必须使用非公共API,如下所示:
@Context
GraphDatabaseAPI graphDb
这个没有被包裹,因此允许你做所有讨厌的事情。有关真实世界的示例,请参阅https://github.com/neo4j-contrib/neo4j-apoc-procedures/blob/master/src/main/java/apoc/periodic/Periodic.java#L26