2

我想复制多个节点,然后同时删除旧节点。为此,我编写了一个多线程 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,b,c
            MATCH (c)-[r3:has_indication]->(a)
            WITH COLLECT(r3) AS rels2, a, b, 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 。

4

2 回答 2

1

为了避免问题(例如,死锁),您应该避免运行更新相同节点或关系(或相同关系上的节点)的并发 neo4j 查询。如果你真的需要运行并发查询,你应该尝试在不相交的子图上运行它们。

有关更多详细信息,请参阅有关隔离级别默认锁定死锁删除语义的 neo4j 文档。

于 2020-08-26T21:38:59.907 回答
1

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

于 2020-09-03T09:35:30.180 回答