我有两个User类型的节点,它们链接到Tweet类型的一个或多个公共节点。图中的一个例子:
我想删除重复的用户并将它们合并到一个节点中。保留两个用户的所有关系。
这是我用来查找需要合并的节点的条件:
MATCH (x:User)-[k:POSTS]->(:Tweet)<-[:POSTS]-(y:User)
使用以下查询:
MATCH (x:User)-[k:POSTS]->(:Tweet)<-[:POSTS]-(y:User)
DELETE k
WITH x, y
MATCH (x)-[r:POSTS]->(z:Tweet)
MERGE (y)-[:POSTS]->(z)
DELETE r
分离user_b但不将推文链接到用户a。
请注意,我也尝试过apoc.refactor.mergeNodes,但它会出错。
如何合并这两个节点保留其相关性?
更新:
MATCH (z:User)
WHERE (z:User)-[:POSTS]->(:Tweet)<-[:POSTS]-(:User)
WITH COLLECT(z) AS zs
CALL apoc.refactor.mergeNodes(zs) YIELD node
RETURN node;
使用此查询我获得重复关系,有没有办法合并?
更新2:
我尝试在我的数据库的更大样本上使用上一个查询,它会出错。
答案 0 :(得分:1)
此查询首先删除从(x)到(tweet)的关系,然后尝试找到它。
试试这个:
MATCH (x:User)
WITH x
MATCH (x)-[:POSTS]->(t:Tweet)<-[r:POSTS]-(y:User) WHERE x <> y AND id(x) > id(y)
WITH x, y, count(t) as ag
MATCH (y)-[r:POSTS]->(z:Tweet)
MERGE (x)-[:POSTS]->(z)
WITH y, count(z) as ag
DETACH DELETE y