Neo4j如何基于关系类型起止点对节点路径进行拆分分段
节点路径按指定关系边界拆分实现方案
这个需求完全可以实现,你仅需要先明确作为拆分触发条件的关系类型,按逻辑遍历路径即可得到你示例中要求的分段结果。
通用实现逻辑
- 先确定作为拆分边界的目标关系类型,规则为遇到该类关系时,在关系的起点/终点位置完成分段切割
- 遍历完整路径的所有节点和关系,同时维护当前正在拼接的分段节点列表
- 若当前节点与下一个节点的关系属于拆分边界类型,就将当前已拼接的节点列表作为独立分段存入结果,再以边界关系的下一个节点作为新分段的起始节点继续遍历
- 路径遍历结束后,将最后未归档的剩余分段存入结果列表即可
Neo4j 环境 Cypher 实现示例
你可以直接使用Cypher的reduce函数完成拆分逻辑,示例代码如下,仅需要替换对应参数即可适配你的业务场景:
// 匹配你需要处理的完整节点路径,此处以从id为1的节点到id为5的节点的路径为例 MATCH path = (start:Node {id:1})-[*]->(end:Node {id:5}) WITH nodes(path) AS all_nodes, relationships(path) AS all_rels // 执行拆分逻辑 WITH reduce( acc = {segments: [], current_segment: [head(all_nodes)]}, idx IN range(0, size(all_rels)-1) | CASE // 遇到指定的拆分边界关系类型时触发分段,此处SEGMENT_BOUNDARY替换为你的实际关系类型 WHEN type(all_rels[idx]) = 'SEGMENT_BOUNDARY' THEN { segments: acc.segments + [acc.current_segment + [all_nodes[idx+1]]], current_segment: [all_nodes[idx+1]] } // 非边界关系则将节点加入当前分段 ELSE { segments: acc.segments, current_segment: acc.current_segment + [all_nodes[idx+1]] } END ) AS temp_result // 拼接最后一段未归档的分段 UNWIND temp_result.segments + [temp_result.current_segment] AS final_segment RETURN final_segment
内容的提问来源于stack exchange,提问作者Satu
相关产品推荐
相关产品推荐

