【问题标题】:update multiple related nodes simultaneously in neo4j with java用java在neo4j中同时更新多个相关节点
【发布时间】:2020-12-15 07:22:47
【问题描述】:

我想复制多个节点,然后同时删除旧节点。为此,我编写了一个多线程 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 。

【问题讨论】:

    标签: neo4j cypher neo4j-driver


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-16
        相关资源
        最近更新 更多