用密码替换节点(和节点)



我有一个拥有700K属性的大型数据库。但有些是重复的,所以我现在要"清理"所有这些东西…

我期待用1+其他(s)取代1+节点,并链接该节点可能存在的所有关系。

所以我想这样做:

MATCH (p:Property) WHERE p.uid IN ['A6271DFB-F0FD-0DF1-6F22-67F7D3164AE6']
WITH p AS sources
MATCH (p2:Property) WHERE p2.uid IN ['51A26A14-74FB-BCFC-FE5C-661A43A9377C','8DCD063C-965D-CC12-6159-E287CD000954']
WITH sources, p2 AS destinations
OPTIONAL MATCH (sources)-[k]->(n) MERGE (destinations)-[y]->(n) SET y=k
WITH sources, destinations
OPTIONAL MATCH (sources)<-[s]-(n) MERGE (destinations)<-[w]-(n) SET w=s
WITH sources
DETACH DELETE sources

当然,它不起作用,因为我需要为合并指定关系类型…但我实际上不知道它(因为它可以是几种类型,根据类型,rel可以有属性)…

所以现在,我开发了一个php脚本来匹配所有节点+节点;和FOREACH记录;生成MERGE查询将它们链接到新节点…但这是缓慢的,没有优化…

有人知道这个吗?

下面的查询应该可以为您工作。它利用APOC插件及其apoc.refactor.mergeNodes过程为您合并节点。该过程传递一个节点集合,在删除第二个到最后一个节点(及其关系)之前,将第二个到最后一个节点(及其关系)合并到第一个节点上,并返回第一个节点。

为了便于说明,下面的两个uid集合都包含多个值;在实际场景中,这两个集合都应该通过参数传递。

MATCH (src:Property) WHERE src.uid IN ['A6271DFB-F0FD-0DF1-6F22-67F7D3164AE6','A6271DFB-F0FD-0DF1-6F22-123456789012']
WITH COLLECT(src) AS sources
MATCH (dest:Property) WHERE dest.uid IN ['51A26A14-74FB-BCFC-FE5C-661A43A9377C','8DCD063C-965D-CC12-6159-E287CD000954']
CALL apoc.refactor.mergeNodes([dest] + sources) YIELD node
RETURN node;

查询首先将所有源节点收集到sources集合中。然后,匹配每个目的节点,并使用apoc.refactor.mergeNodes过程将所有源节点合并到每个目的节点。([dest] + sources语法生成一个新的集合,按此顺序组合dest节点和sources节点。)查询返回每个(合并的)目标节点。

最新更新