Neo4j如何合并2个或多个重复的节点?

6

我正在使用Cypher手动填充我的neo4j数据库,因此容易出现错误,例如创建重复节点:

这些重复节点将与其他节点建立关系。是否有内置函数可以合并这些节点?还是应该手动操作?

听起来可能可以,但使用Cypher脚本会很复杂:

    1. 获取每个重复节点的关系
    1. 重新创建它们(具有它们的属性)以正确的节点(给定节点ID)
    1. 删除与重复节点的关系
    1. 最后删除重复节点。
3个回答

2
为了避免将来出现这种情况,请查看Cypher中的MERGE关键字。 不幸的是,据我所知,Cypher中还没有像以下这样的内容:
MATCH (n:MyNode),(m:MyNode)
WHERE ID(n) <> ID(m) AND
PROPS(n) IN PROPS(m) AND PROPS(m) IN PROPS(n)
(...) DELETE (...)

第三行的虚构函数 PROPS 不是 Cypher 语言的一部分,用户定义的函数也尚未进入 Neo4j。
如果您没有在生产实例中工作,最简单的方法可能是备份数据文件夹,并尝试重新开始插入(使用 MERGE)。
否则,您还可以尝试编写一个 遍历 来收集重复项并批量删除它们(这里是一个 示例 使用 REST API)。

1

我认为你可以尝试:

apoc.refactor.mergeNodes(nodes, options)

对于关系:

apoc.refactor.mergeRelationships(rels, options)

或者:

apoc.periodic.iterate(query, options)

1

试试这个:

MATCH (n:MyNode),(m:MyNode),(o:OtherNode {id:123})
WHERE n <> m
MATCH (m)-[r:FOO]->()
CREATE (n)-[r2:FOO]->(o)
SET r2 = r
DELETE r,m

9
可以提供一个详细的描述,说明上面的代码片段在做什么以及它的工作原理,而不仅仅是说“试试这个”。 - Levi Roberts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接