Neo4j Cypher:合并重复的节点

Jua*_*tes 3 neo4j cypher

我有一些重复的节点,都带有标签Tag.重复的意思是我有两个具有相同名称属性的节点,例如:

{ name: writing, _id: 57ec2289a90f9a2deece7e6d},
{ name: writing, _id: 57db1da737f2564f1d5fc5a1},
{ name: writing }
Run Code Online (Sandbox Code Playgroud)

_id字段不再使用,因此在所有效果中,这三个节点是相同的,只是每个节点具有不同的关系.

我想做的是:

  1. 找到所有重复的节点(检查)

    MATCH (n:Tag)
    WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count
    WHERE count > 1
    RETURN name, nodelist, count
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将所有关系从重复节点复制到第一个节点

  3. 删除所有重复的节点

这可以通过密码查询来实现吗?或者我是否必须使用某种编程语言编写脚本?(这是我想避免的)

Inv*_*con 9

APOC程序有一些图形重构程序可以提供帮助.我认为apoc.refactor.mergeNodes()应该这样做.

请注意,除了将所有关系从其他节点传输到列表的第一个节点之外,它还会将来自其他节点的任何标签和属性应用到第一个节点上.如果这不是您想要做的事情,那么您可能必须从其他节点收集传入和传出关系并使用apoc.refactor.to()apoc.refactor.from()不是.

这是合并节点的查询:

MATCH (n:Tag)
WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count
WHERE count > 1
CALL apoc.refactor.mergeNodes(nodelist) YIELD node
RETURN node
Run Code Online (Sandbox Code Playgroud)