从另一个节点复制关系

时间:2017-02-10 15:01:59

标签: neo4j cypher

我有两个User类型的节点,它们链接到Tweet类型的一个或多个公共节点。图中的一个例子:

enter image description here

我想删除重复的用户并将它们合并到一个节点中。保留两个用户的所有关系。

这是我用来查找需要合并的节点的条件:

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:

我尝试在我的数据库的更大样本上使用上一个查询,它会出错。

1 个答案:

答案 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