обновить несколько связанных узлов одновременно в neo4j с помощью java

Я хочу скопировать несколько узлов, а затем удалить старые одновременно. Для этого я написал многопоточное 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 enterprise версии 3.4.7.


person zahra.dgh    schedule 26.08.2020    source источник


Ответы (2)


Чтобы избежать проблем (например, взаимоблокировок), вам следует избегать одновременного выполнения запросов neo4j, которые обновляют одни и те же узлы или отношения (или узлы в тех же отношениях). Если вам действительно нужно выполнять параллельные запросы, вы должны попытаться запустить их на непересекающихся подграфах.

См. Документацию neo4j об уровнях изоляции, блокировка по умолчанию, взаимоблокировки и семантика удаления для получения дополнительных сведений.

person cybersam    schedule 26.08.2020

Вы не можете запускать одновременные запросы на одних и тех же узлах, потому что происходит взаимоблокировка. Вы можете использовать семафор, чтобы избежать работы нескольких запросов в критической секции.

person Zeynab Sobhani    schedule 03.09.2020