You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按指定节点的前后节点分组FOLLOWS关系图的Cypher查询结果?

按指定节点的前序/后续层级分组查询FOLLOWS关系图

问题背景

给定FOLLOWS关系的图结构如下:

H->G->E->D
     ->F

对应关系:

  • H-[:FOLLOWS]->G(H关注G)
  • G-[:FOLLOWS]->E、G-[:FOLLOWS]->F(G同时关注E和F)
  • E-[:FOLLOWS]->D(E关注D)

已知节点G的属性(如name='G'),需要查询得到按与G的层级关系分组的结果,格式为[{H}, {G}, {E, F}, {D}],即:

  • 第1组:G的直接前序节点(H)
  • 第2组:G自身
  • 第3组:G的直接后续节点(E、F)
  • 第4组:G的二级后续节点(D)

原尝试语句问题

你之前尝试的Cypher语句逻辑存在问题:

MATCH (prev:Person)<-[:FOLLOWS *0..]-(p:Person)<-[:FOLLOWS *0..]-(next:Person) WHERE p.name ='G' RETURN collect(prev), p, collect(next) as result

*0..会包含节点自身,且双向路径匹配会导致节点重复关联,无法按层级区分前序/后续节点,最终结果不符合分组要求。

正确解决方案

使用以下Cypher语句可以实现需求:

// 收集G的所有前序节点,用负层级标记
MATCH (prev:Person)-[:FOLLOWS*]->(g:Person)
WHERE g.name = 'G'
WITH g, prev AS node, -length((prev)-[:FOLLOWS*]->(g)) AS level

// 加入G自身,层级为0
UNION ALL
MATCH (g:Person)
WHERE g.name = 'G'
WITH g, g AS node, 0 AS level

// 收集G的所有后续节点,用正层级标记
UNION ALL
MATCH (g:Person)-[:FOLLOWS*]->(next:Person)
WHERE g.name = 'G'
WITH g, next AS node, length((g)-[:FOLLOWS*]->(next)) AS level

// 按层级分组并排序,输出最终结果
WITH level, collect(node.name) AS group
ORDER BY level
RETURN collect(group) AS result

语句逻辑说明

  1. 前序节点处理:匹配所有指向G的节点,用负的路径长度表示前序层级(H到G是1步,层级为-1)
  2. 自身节点处理:单独加入G节点,层级标记为0
  3. 后续节点处理:匹配所有G指向的节点,用正的路径长度表示后续层级(E、F到G是1步,层级为1;D到G是2步,层级为2)
  4. 分组排序:按层级从小到大排序,收集每个层级的节点名称,最终得到按层级分组的列表结果。

执行后返回的结果格式为:

[["H"], ["G"], ["E", "F"], ["D"]]

完全符合需求的分组形式。

内容的提问来源于stack exchange,提问作者Lisvar27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:15:56