如何编写Neo4j Cypher查询并合并拥有至少2个公共节点的节点
Neo4j 公共邻接节点查询Cypher实现方案
场景1:查询两两共享至少2个公共节点的节点对
适用于仅存在ROW1、ROW2两个节点共享ID_B、ID_C两个公共节点的图谱场景:
// 匹配两个不同的Row节点,及二者共同关联的中间ID节点 MATCH (r1:Row)-[:REL]->(common_id:ID)<-[:REL]-(r2:Row) WHERE id(r1) < id(r2) // 避免重复返回r1-r2、r2-r1同一对 WITH r1, r2, collect(DISTINCT common_id) AS shared_ids WHERE size(shared_ids) >= 2 // 筛选至少2个公共节点的配对 // 返回两个节点详情及公共节点列表 RETURN r1 AS row1_detail, r2 AS row2_detail, shared_ids AS common_nodes
注:请将代码中的:Row(行节点标签)、:REL(行节点与ID节点的关系类型)、:ID(公共ID节点标签)替换为你实际的图谱结构定义。
场景2:多节点连锁共享公共节点的合并查询
适用于存在Row1、Row2、Row3两两之间均满足至少2个公共节点的图谱场景,可合并返回所有关联的Row节点:
// 先匹配所有满足两两共享≥2公共节点的Row对 MATCH (r1:Row)-[:REL]->(common_id:ID)<-[:REL]-(r2:Row) WHERE id(r1) < id(r2) WITH r1, r2, collect(DISTINCT common_id) AS shared_ids WHERE size(shared_ids) >= 2 // 收集所有关联的Row节点去重,同时收集所有配对的公共节点 WITH collect(DISTINCT r1) + collect(DISTINCT r2) AS all_row_list, collect({row_pair: [r1.name, r2.name], shared: shared_ids}) AS pair_shared_info UNWIND all_row_list AS row WITH DISTINCT row, pair_shared_info // 合并返回所有相关Row详情及各配对的公共节点信息 RETURN collect(DISTINCT row) AS all_related_row_details, pair_shared_info AS all_pair_common_nodes
如果仅需要返回所有符合条件的Row节点的完整属性,将RETURN语句替换为RETURN collect(DISTINCT row{.*}) AS row_detail_list即可。
内容的提问来源于stack exchange,提问作者SSK
相关产品推荐
相关产品推荐

