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

Neo4j Cypher:获取满足条件的可变长度路径邻居,过滤不符合条件节点

解决你的Cypher路径查询需求

我来帮你搞定这个问题!先明确下你的图结构:我们有一条链式节点 a-[:PREVIOUS]->b-[:PREVIOUS]->c-[:PREVIOUS]->d-[:PREVIOUS]->e-[:PREVIOUS]->f,其中只有e关联的是Blue颜色节点,其他节点(b、c、d、f)都连接到同一个唯一的Red颜色节点。你需要写Cypher查询来获取满足条件的可变长度路径邻居,同时跳过不符合条件的节点(也就是e)。

下面根据两种常见需求给出对应的查询方案:

方案1:路径全程无不符合条件的节点(仅保留全Red节点的路径)

如果你需要确保路径上的每一个节点(包括中间节点)都关联Red颜色,完全跳过e节点(也就是不允许路径经过e),可以用这个查询:

// 先匹配唯一的Red颜色节点,提升查询效率
MATCH (red:Colour {Name: 'Red'})
// 匹配从起点(这里假设是a,你可以替换成其他节点标识)出发的可变长度PREVIOUS路径
MATCH path = (start)-[:PREVIOUS*]->(neighbor)
WHERE start.name = 'a' // 如果节点没有name属性,可替换为ID(start) = 你的节点ID
// 确保路径上的所有节点都关联Red颜色
AND ALL(node IN nodes(path) WHERE EXISTS((node)-[:IS]->(red)))
// 返回路径和符合条件的邻居节点
RETURN path, neighbor, [node IN nodes(path) | node.name] AS path_node_names

这个查询会返回的邻居是b、c、d,因为到f的路径必须经过e(关联Blue),所以会被排除。

方案2:仅要求邻居节点符合条件(忽略路径中间的不符合节点)

如果你只关心最终的邻居节点是关联Red的,不管路径中间是否经过e,可以用这个更简单的查询:

MATCH (red:Colour {Name: 'Red'})
MATCH (start)-[:PREVIOUS*]->(neighbor)-[:IS]->(red)
WHERE start.name = 'a'
// 去重,避免同一邻居被多次返回
RETURN DISTINCT neighbor, [node IN nodes((start)-[:PREVIOUS*]->(neighbor)) | node.name] AS path_node_names

这个查询会返回的邻居是b、c、d、f,虽然到f的路径经过e,但只要f本身关联Red就会被包含进来。

小提示

  • 如果你的节点没有name属性,可以用节点ID(ID(start) = 123)或者其他唯一标识来定位起点。
  • 因为Red颜色节点是唯一的,提前匹配它再复用能大幅提升查询性能,避免重复匹配同一个节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:43:33