neo4j合并2个或多个重复节点

时间:2014-04-29 23:08:22

标签: neo4j cypher

我正在使用cypher手动提供我的neo4j数据库,因此容易出错,比如创建重复的节点:

重复节点将具有与其他节点的每个关系。 是否有内置函数来合并这些节点?或者我应该手动完成吗?

听起来可能,但cypher脚本很复杂:

    1. 获取每个重复节点的关系
    1. 使用正确的节点(给定节点ID)重新创建它们(及其属性)
    1. 删除与重复节点的关系
    1. 最后删除重复的节点。

3 个答案:

答案 0 :(得分: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)。

否则,您也可以尝试编写traversal来收集重复项并批量删除它们(这里是带有REST API的example)。

答案 1 :(得分:2)

试试这个:

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

答案 2 :(得分:0)

我想你可以试试:

apoc.refactor.mergeNodes(nodes, options)

关系:

apoc.refactor.mergeRelationships(rels, options)

或者:

apoc.periodic.iterate(query, options)