@TOC[1] Here's the table of contents:
•一、查找需要合并的概念•二、扩展概念查看一度关联关系•三、新建一个节点•四、将节点列表合并到第一个节点 •4.1 待操作节点 •4.2 将节点一度关系全部扩展出来 •4.3 进行重构分析 •4.4 重构时设置不对节点属性进行操作 •4.5 重构后的效果•四、总结
图数据☞重构子图
子图重构
一般出现在数据运维阶段。当数据出现错误或者调整数据模型后需要修改数据
时,需要对图数据节点或者关系进行批量重构。数据重构的方法避免了数据的重新组织导入,节省资源的同时可以进行快速批量操作。 下面介绍一种节点模式
下的子图重构方法,该方法是将节点进行合并并且对其关联关系同时迁移的方法。需要指定合并的目标节点,以及被合并的目标节点,并以可选模式指定其属性的合并操作方式。
一、查找需要合并的概念
代码语言:javascript复制首先,找到两个需要被合并的目标节点,在这里我使用
聚烯烃材料
、晶硅炉
,两个关键词节点(在这里建立的是关键词和文档之间的包含关系图谱,一个词可能会出现在多个不同文档中)。
MATCH (kw:关键词) WHERE kw.name IN ['聚烯烃材料','晶硅炉'] RETURN kw
二、扩展概念查看一度关联关系
代码语言:javascript复制下面
棕色
表示文档,红色
表示关键词。通过如下查询可以关联出聚烯烃材料
、晶硅炉
两个关键词所有一度包含关系。
MATCH p=(kw:关键词)--() WHERE kw.name IN ['聚烯烃材料','晶硅炉'] RETURN p
三、新建一个节点
代码语言:javascript复制后续会将
聚烯烃材料
和晶硅炉
两个关键词节点,以及它们的一度网络合并到这个新节点。
CREATE (kw:概念 {name:'工业制造'}) RETURN ID(kw) AS idN
四、将节点列表合并到第一个节点
4.1 待操作节点
代码语言:javascript复制该查询展示了,三个待操作节点,其中
绿色
为刚刚创建的新节点,其标签为概念
。
MATCH (n) WHERE ID(n) IN [2133617,34934,213289] RETURN n
4.2 将节点一度关系全部扩展出来
概念
节点目前没有任何关联关系,在接下来的操作中我将会把上述关键词子图
合并到概念节点上
。
4.3 进行重构分析
如
待操作节点
中,ID列表中第一个节点为新建的工业制造
概念节点,第一个节点之后的其它节点以及节点关联的关系将会被合并到第一个节点。被合并的节点,执行结束之后会被删除。合并时属性操作支持三个选项:overwrite、discard、combine。
overwrite
会覆盖合并实体的属性;discard
属性重复时不会执行任何操作;combine
属性重复时,会存储在一个数组里面。
被合并节点的关系与合并节点的关系重复时会新建,可以使用
apoc.refactor.mergeRelationships
再对关系合并;apoc.refactor.mergeRelationships
合并关系时需要注意,关系的起始和结束节点都要相同,可配置的属性与apoc.refactor.mergeNodes
是一样的。
4.4 重构时设置不对节点属性进行操作
代码语言:javascript复制默认的操作:如果节点上关系重复,则会新建,也就是边有可能会重复;节点的标签会合并到第一个节点。
MATCH (n) WHERE ID(n) IN [2133617,34934,213289] WITH COLLECT(n) AS nodes
CALL apoc.refactor.mergeNodes(nodes,{properties:'discard'}) YIELD node RETURN node
4.5 重构后的效果
三个节点变一个节点,三个子图变一个子图。
四、总结
本文介绍了,节点模式下的数据重构方法。在实际的数据生产操作中是非常实用的,在关系模式下的重构与此方法类似。重构时一般都是批量操作数据,在支持ACID的数据库中为了避免频繁发生死锁问题,存储过程中都不支持数据的并发操作。
References
[1]
TOC: 图数据☞重构子图