使用Java在neo4j中同时更新多个相关节点

问题描述

我想复制多个节点,然后同时删除旧的节点。为此,我编写了一个多线程Java应用程序。 我的密码查询如下:

String cypher= "MATCH (a:Person {surname:\""+ Thread.currentThread().getName()+"\"})
            create (b:Person) 
            set b.surname=a.surname
            SET b.version = '2'
            WITH a,b
            MATCH (a)-[r:has_indication]->(c)
            WITH COLLECT(r) AS rels,a,b,c
            FOREACH (rel in rels |
                   CREATE (b)-[r2:has_indication]->(c) 
                   SET r2+=rel
            )
            with a,c
            MATCH (c)-[r3:has_indication]->(a)
            WITH COLLECT(r3) AS rels2,c
            FOREACH (rel in rels2 |
                   CREATE (c)-[r3:has_indication]->(b) 
                   SET r3+=rel 
            ) 
            DETACH DELETE a " ;

我的Java代码如下:

public void run() {
       Driver driver = GraphDatabase.driver(
              "bolt://localhost:7687",AuthTokens.basic("neo4j","neo4j"));
       Session session = driver.session();
       session.runAsync( cypher);       
}

我使用3线程,当三个节点相互关联时,只有一个节点被更新,但是当这些节点彼此不相关时,所有三个节点都被成功更新。 即使它们同时具有相互关系,如何更新它们? 我正在使用neo4j企业版3.4.7。

解决方法

为避免出现问题(例如死锁),应避免运行并发neo4j查询,这些查询会更新相同的节点或关系(或具有相同关系的节点)。如果确实需要运行并发查询,则应尝试在不相交的子图上运行它们。

有关更多详细信息,请参见isolation levelsdefault lockingdeadlocksdelete semantics上的neo4j文档。

,

由于死锁的发生,您不能在同一节点上运行并发查询。您可以使用信号量来避免多个查询在关键部分中起作用。