Neo4j Cypher查询:查找存在指定数量唯一路径的连通节点,返回1对多结果
Neo4j 查询满足指定唯一路径数的连通节点方案
需求说明
需要查询与其他节点存在至少N条唯一路径的连通节点,要求单条查询返回1对多的聚合结果,N可灵活配置为1、2、3对应不同业务场景。
你当前使用的查询仅能返回1对1的节点映射,核心逻辑可以保留,在此基础上增加分组聚合步骤即可实现需求。
通用可配置查询语句
// 仅需修改min_path_count的数值即可适配不同路径数要求 MATCH (r1:Record)-[:HAS_ID]->(i)<-[:HAS_ID]-(r2:Record) WHERE id(r1) > id(r2) WITH r1, r2, COLLECT(DISTINCT i) AS shared_ids WHERE SIZE(shared_ids) >= $min_path_count WITH r1.name AS Source, COLLECT(r2.name) AS target_nodes RETURN Source, apoc.text.join(target_nodes, ', ') AS Target
若未安装APOC插件,可将最后一行替换为
RETURN Source, target_nodes AS Target,直接返回列表格式的目标节点集合。
不同阈值的查询结果示例
1. 至少2条唯一路径
min_path_count设为2时,返回结果:
| Source | Target |
|---|---|
| Row_1 | ROW_2, ROW_3, ROW_6 |
2. 至少3条唯一路径
min_path_count设为3时,返回结果:
| Source | Target |
|---|---|
| Row_2 | ROW_6 |
3. 至少1条唯一路径
min_path_count设为1时,返回结果:
| Source | Target |
|---|---|
| Row_1 | ROW_2, ROW_3, ROW_4, ROW_5, ROW_6 |
逻辑说明
- 路径去重:通过
COLLECT(DISTINCT i)对共同关联的ID节点去重,确保每条唯一路径仅统计一次 - 1对多聚合:按源节点名称分组,将所有符合条件的目标节点聚合为列表,再拼接为逗号分隔的字符串,匹配要求的返回格式
- 灵活适配:仅需调整最小路径数阈值即可覆盖所有场景,无需修改整体查询逻辑
内容的提问来源于stack exchange,提问作者SSK
相关产品推荐
相关产品推荐

