绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Neo4j | 实体和关系的合并
2020-05-21 15:26:28

实体消歧

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

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

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

案例一:

可发现下图中共存在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所不具备的一些功能,想研究的同学可以好好研究一下。

参考:

cypher笔记

apoc工具

Neo4j教程:

卡布基诺F:Neo4j模糊查询zhuanlan.zhihu.com图标卡布基诺F:Neo4j创建索引zhuanlan.zhihu.com图标卡布基诺F:Neo4j数据导入zhuanlan.zhihu.com图标

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Neo4j 图形数据库
创建时间:2020-05-19 17:48:05
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。 Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注.
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • ?
    专家
戳我,来吐槽~