【问题标题】:replace nodes (and rels) with cypher用密码替换节点(和rels)
【发布时间】:2016-09-20 12:45:22
【问题描述】:

我有一个包含 700K 属性的大型数据库。但是有些是重复的,所以我现在想“清理”所有这些东西......

我期待将 1+ 个节点替换为 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 脚本来匹配所有节点+rels;和 FOREACH 记录;生成一个 MERGE 查询以将它们链接到新节点......但这很慢而且没有优化......

有人知道吗?

【问题讨论】:

标签: neo4j cypher


【解决方案1】:

以下查询应该适合您。它利用APOC plugin 及其apoc.refactor.mergeNodes 过程为您合并节点。该过程传递一个节点集合,将第二个到最后一个节点(及其关系)合并到第一个节点,然后删除第二个到最后一个节点(及其关系),然后返回第一个节点。

出于说明目的,以下两个 uid 集合都包含多个值;在真实场景中,两个集合都应该通过parameters 传递。

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 节点。) 查询返回每个(合并的)目标节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多