实体消歧
图数据存储的过程中有时会遇到这样一类问题,对于实体和关系数据而言,在数据预处理或者数据清洗时可以做到实体间是不会重复的(去除重复的数据);虽然实体不重复,但可能两个实体所代表含义是相同的,这部分需要做的工作就是实体消歧。
但传统意义上的实体消歧应该是在数据清洗准备阶段进行的(利用各种消除歧义、实体对齐的方法统一含义相同的实体),既对相同的实体合并后统一为一个实体后在入库,但对于一些特殊的业务场景,传统的实体消歧的方法就失去了作用。
例如对于这样一种业务场景:假设目前存在一些企业数据,企业与人员之间存在一些法人、董事、股东、投资的关系,但网络中存在多个叫“小明”(此处没有类似身份证号的标识进行标记)的人,只知道每个“小明”可能和不同的企业之间存在不同的关系,且里面一些“小明”可能是同一个人但创建了多个节点,这里就需要对是同一个人的“小明”实体进行合并,而不是同一个“小明”的实体不进行合并,合并当然有一定的业务逻辑和规则。
案例一:
可发现下图中共存在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)
可以发现在实体合并后,相应的关系也迁移到了新的实体,但是仔细观察可以发现实体与实体之间存在了重复的关系,这些关系是本来就存在的,只是随实体的合并发了转移,但这些重复的关系是没有必要都存在的,可以终只保留一条,所以对重复的关系再进行合并。
MATCH (a:人员)-[r:个人对外投资]-(b:企业)
WITH a, b, collect(r) as rels
CALL apoc.refactor.mergeRelationships(rels,{properties:"combine"})
YIELD rel
RETURN count(rel)
PS:APOC为Neo4j官方社区提供的一个类存储过程的工具,能够实现Neo4j所不具备的一些功能,想研究的同学可以好好研究一下。
参考:
Neo4j教程:
卡布基诺F:Neo4j模糊查询卡布基诺F:Neo4j创建索引卡布基诺F:Neo4j数据导入