apoc.nodes.cycles

在 APOC 2025.07 版本发布之前,此过程在本地实例上受到限制。若要在旧版本上使用它,必须解除限制。有关详细信息,请参阅 安装 → 加载和解除限制
详细信息

语法

apoc.nodes.cycles(nodes [, config ]) :: (path)

描述

检测给定 LIST<NODE>(节点列表)中的所有 PATH(路径)循环。此过程也可限定在 RELATIONSHIP(关系)值上。

输入参数

名称

类型

描述

节点

LIST<NODE>

用于检查路径循环的节点列表。

config

MAP

{ maxDepth :: INTEGER, relTypes = [] :: LIST<STRING> }。默认值为:{}

返回参数

名称

类型

描述

path

PATH

包含所发现循环的路径。

配置参数

配置参数
名称 类型 默认 描述

maxDepth

INTEGER(整数)

Integer.MAX_VALUE

搜索循环时允许的最大跳数(关系数)。

关系类型

LIST<STRING>

[]

用于检测循环的关系类型。默认情况下,将考虑所有类型。

用法示例

本节中的示例基于以下示例图

CREATE (m1:Start {bar: 'alpha'}) with m1 CREATE (m1)-[:DEPENDS_ON {id: 0}]->(m2:Module {bar: 'one'})-[:DEPENDS_ON {id: 1}]->(m3:Module {bar: 'two'})-[:DEPENDS_ON {id: 2}]->(m1)  WITH m1, m2, m3 CREATE (m1)-[:DEPENDS_ON {id: 3}]->(m2), (m2)-[:ANOTHER {id: 4}]->(m3), (m2)-[:DEPENDS_ON {id: 5}]->(m3) CREATE (m1)-[:DEPENDS_ON {id: 6}]->(:Module {bar: 'seven'})-[:DEPENDS_ON {id: 7}]->(:Module {bar: 'eight'})-[:DEPENDS_ON {id: 8}]->(m1);
CREATE (m1:Start {bar: 'beta'}) with m1 CREATE (m1)-[:MY_REL {id: 9}]->(m2:Module {bar: 'three'})-[:MY_REL  {id: 10}]->(m3:Module {bar: 'four'})-[:MY_REL {id: 11}]->(m1);
CREATE (m1:Start {bar: 'gamma'}) with m1 CREATE (m1)-[:DEPENDS_ON {id: 12}]->(m2:Module {bar: 'five'})-[:DEPENDS_ON {id: 13}]->(m3:Module {bar: 'six'});
CREATE (m1:Start {bar: 'delta'}) with m1 CREATE (m1)-[:DEPENDS_ON {id: 20}]->(m1);
CREATE (m1:Start {bar: 'epsilon'}) with m1 CREATE (m1)-[:DEPTH_ONE {id: 30}]->(:Module {bar: 'seven'})-[:DEPTH_ONE {id: 31}]->(m1);

上述数据集包含:一个具有 2 个循环的 alpha 节点,一个具有 1 个循环的 beta 节点,一个没有循环的 gamma 节点,一个具有 1 个循环(仅包含 1 个中间节点)的 delta 节点,以及一个具有自环关系的 epsilon 节点。

dataset cycle

我们可以执行以下查询,查找从 Start 节点开始的所有循环。

MATCH (m1:Start) WITH collect(m1) as nodes CALL apoc.nodes.cycles(nodes) YIELD path RETURN path
all cycles

请注意,对于存在多重关系的情况(在此示例中,在 (:Start {bar: 'alpha'})(:Module {bar: 'one'}) 之间,以及在 (:Module {bar: 'one'})(:Module {bar: 'two'}) 之间),仅会考虑第一个发现的循环。

我们还可以指定关系类型列表来检测循环。例如:

MATCH (m1:Start) WITH collect(m1) as nodes CALL apoc.nodes.cycles(nodes, {relTypes: ["DEPENDS_ON", "MY_REL", "NOT_EXISTENT"]}) YIELD path RETURN path
rel types cycles

此外,我们可以指定 maxDepth 以仅考虑具有 n 个中间节点的循环。例如:

MATCH (m1:Start) WITH collect(m1) as nodes CALL apoc.nodes.cycles(nodes, {maxDepth: 1}) YIELD path RETURN path
cycles max depth 1

请注意,也允许设置 maxDepth: 0,此时仅返回具有一个或多个自环关系的节点。

MATCH (m1:Start) WITH collect(m1) as nodes CALL apoc.nodes.cycles(nodes, {relTypes: ['DEPENDS_ON'], maxDepth: 0}) YIELD path RETURN path
cycles max depth 0