apoc.nodes.cycles
语法 |
|
||
描述 |
检测给定 |
||
输入参数 |
名称 |
类型 |
描述 |
|
|
要检查路径循环的节点列表。 |
|
|
|
|
|
返回参数 |
名称 |
类型 |
描述 |
|
|
包含所找到循环的路径。 |
|
配置参数
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
|
|
Integer.MAX_VALUE |
搜索循环的最大跳数(关系数)。 |
|
|
[] |
用于检测循环的关系类型。默认情况下,所有类型都将被考虑。 |
使用示例
本节示例基于以下示例图
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。
我们可以执行以下查询,它将查找从 Start 节点开始的所有循环
MATCH (m1:Start) WITH collect(m1) as nodes CALL apoc.nodes.cycles(nodes) YIELD path RETURN path
请注意,在具有双重关系(本例中,(: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
此外,我们可以指定 maxDepth 来考虑仅包含 n 个中间节点的循环。例如
MATCH (m1:Start) WITH collect(m1) as nodes CALL apoc.nodes.cycles(nodes, {maxDepth: 1}) YIELD path RETURN path
请注意,也允许 maxDepth: 0,此时只返回带有一个或多个自关系的节点。
MATCH (m1:Start) WITH collect(m1) as nodes CALL apoc.nodes.cycles(nodes, {relTypes: ['DEPENDS_ON'], maxDepth: 0}) YIELD path RETURN path