中医目诊特征数据库节点去重与融合操作记录

一、问题背景

在标签 中医目诊特征数据库 下,发现存在名称相同但节点 ID 不同的重复节点。

例如:

  • 两个 “鲜红色”
  • 两个 “斑”
  • 两个 “点”

这些节点虽然 name 相同,但由于历史导入或建模过程问题,被创建为多个独立节点。

目标是:

将名称相同的节点融合为一个节点,同时保留并合并它们原有的所有关系与属性。


二、解决思路

Neo4j 原生 Cypher 不支持直接“融合节点并自动合并所有关系”。

因此采用 APOC 扩展库中的 apoc.refactor.mergeNodes() 实现节点融合。

核心逻辑分为三步:

  1. 中医目诊特征数据库 标签下按 name 分组
  2. 找出重复(count > 1)的节点集合
  3. 使用 mergeNodes 将同名节点融合

三、执行代码

1
2
3
4
5
6
7
8
MATCH (n:`中医目诊特征数据库`)
WITH n.name AS name, collect(n) AS nodes, count(*) AS cnt
WHERE name IS NOT NULL AND cnt > 1
CALL apoc.refactor.mergeNodes(
nodes,
{mergeRels:true, properties:"combine"}
) YIELD node
RETURN name, cnt, id(node) AS keptId;

四、参数说明

1️⃣ mergeRels:true

  • 将被融合节点的所有关系自动合并到保留节点
  • 保证不丢失任何边

2️⃣ properties:"combine"

  • 属性合并策略
  • 如果多个节点有同名属性:
    • 尽量合并
    • 避免覆盖
    • 必要时形成数组

五、返回结果含义

示例返回:

name cnt keptId
鲜红色 2 19
2 1
2 2

含义解释:

  • name:重复的节点名称
  • cnt:融合前该名称下的节点数量
  • keptId:融合后保留下来的节点 ID

例如:

“鲜红色” 原有 2 个节点
融合后保留 ID=19
另一个节点已被合并删除


六、融合后验证

为确认重复已清理完成,执行:

1
2
3
4
MATCH (n:`中医目诊特征数据库`)
WITH n.name AS name, count(*) AS cnt
WHERE name IS NOT NULL AND cnt > 1
RETURN name, cnt;

若返回空结果,说明:

  • 所有同名节点已成功融合
  • 当前数据结构中不存在重复名称节点

七、本次操作效果

✔ 同名节点统一为单一实体
✔ 所有关系成功合并
✔ 数据结构更加规范
✔ 为后续建立唯一性约束打下基础


八、后续建议(防止再次重复)

建议为 name 建立唯一性约束,例如:

1
2
3
CREATE CONSTRAINT feature_name_unique
FOR (n:`中医目诊特征数据库`)
REQUIRE n.name IS UNIQUE;

这样以后:

  • 相同名称无法再次被创建
  • 从源头避免重复问题

总结

本次操作完成了:

  • 重复节点识别
  • 节点融合
  • 关系合并
  • 数据结构规范化

通过 APOC 的 mergeNodes,实现了安全、完整、无信息丢失的节点去重处理。