问题描述
我想复制多个节点,然后同时删除旧的节点。为此,我编写了一个多线程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 levels,default locking,deadlocks和delete semantics上的neo4j文档。
,由于死锁的发生,您不能在同一节点上运行并发查询。您可以使用信号量来避免多个查询在关键部分中起作用。