2015-08-28 263 views
1

这与Merge existing records in neo4j, remove duplicates, keep relationships类似,只是我想要合并的节点具有0-2的关系。合并neo4j中的现有记录,删除重复项,保留可选关系

取所产生的图形:

create (:Person {name:"Bob"})-[:RELATED_TO]->(:Person {name:"Jane"})-[:FRIENDS_WITH]->(:Person {name:"Tim"})<-[:FRIENDS_WITH]-(:Person {name:"Jane"}), 
(:Person {name:"Sally"})-[:RELATED_TO]->(:Person {name:"Jane"}) 

我想合并重复简节点,保留RELATED_TO和FRIENDS_WITH关系,删除重复项。

从另一个问题,我可以得到尽可能:

match (p:Person {name:"Jane"}) 
with p.name as name, collect(p) as ps, count(*) as pcount 
where pcount > 1 
with head(ps) as first, tail(ps) as rest 
unwind rest as to_delete 
return to_delete 

但我似乎无法得到正确的合并匹配和/或可选的比赛。我尝试链接可选匹配,并在一个语句中进行合并,neo4j给我一个Statement.ExecutionFailure,没有额外的消息。我试图打破每场比赛的合并,并以“其他节点为空”结束。思考?

回答

4

以下查询正在工作。在一个侧面说明,对于这种重构的我很想有一天,将有可能设置一个动态变量的关系式:

MATCH (n:Person { name:"Jane" }) 
WITH collect(n) AS janes 
WITH head(janes) AS superJane, tail(janes) AS badJanes 
UNWIND badJanes AS badGirl 
OPTIONAL MATCH (badGirl)-[r:FRIENDS_WITH]->(other) 
OPTIONAL MATCH (badGirl)<-[r2:RELATED_TO]-(other2) 
DELETE r, r2, badGirl 
WITH superJane, collect(other) AS friends, collect(other2) AS related 
FOREACH (x IN friends | MERGE (superJane)-[:FRIENDS_WITH]->(x)) 
FOREACH (x IN related | MERGE (x)-[:RELATED_TO]->(superJane)) 

结果:

enter image description here

+0

正是曾担任我想了。谢谢! – David