Neo4j | 实体和关系的合并

2020-05-21 00:00:00 合并 关系 实体 小明 基诺

实体消歧

图数据存储的过程中有时会遇到这样一类问题,对于实体和关系数据而言,在数据预处理或者数据清洗时可以做到实体间是不会重复的(去除重复的数据);虽然实体不重复,但可能两个实体所代表含义是相同的,这部分需要做的工作就是实体消歧。

但传统意义上的实体消歧应该是在数据清洗准备阶段进行的(利用各种消除歧义、实体对齐的方法统一含义相同的实体),既对相同的实体合并后统一为一个实体后在入库,但对于一些特殊的业务场景,传统的实体消歧的方法就失去了作用。

例如对于这样一种业务场景:假设目前存在一些企业数据,企业与人员之间存在一些法人、董事、股东、投资的关系,但网络中存在多个叫“小明”(此处没有类似身份证号的标识进行标记)的人,只知道每个“小明”可能和不同的企业之间存在不同的关系,且里面一些“小明”可能是同一个人但创建了多个节点,这里就需要对是同一个人的“小明”实体进行合并,而不是同一个“小明”的实体不进行合并,合并当然有一定的业务逻辑和规则。

案例一:

可发现下图中共存在6个相同姓名的人员实体,其中左边三个每个都为单独且不同的实体,右边三个则表示同一个实体,所以需要对右边三个实体进行合并,但在合并的时候需要注意,节点合并后相应的关系也需要迁移到新的节点上。

合并实体前
MATCH (n:人员) 
with n.人员姓名 as name,collect(n) as nodelist,count(n) as nodecount
where nodecount > 1
call apoc.refactor.mergeNodes(nodelist) YIELD node
RETURN count(node)

相关文章