我正在尝试使用WITH RECURSIVE方法在PostgreSQL和Apache AGE上创建的图中检测循环。有人可以指导我为什么我的密码查询无法检测循环吗?我使用了这个reference。下面是我的尝试代码:
WITH RECURSIVE dependency_path AS (
SELECT module_id, dependency_id, ARRAY[module_id] AS path
FROM dependencies
UNION ALL
SELECT dp.module_id, d.dependency_id, path || dp.module_id
FROM dependency_path dp, dependencies d
WHERE dp.dependency_id = d.module_id
AND NOT (dp.path @> ARRAY[d.dependency_id])
)
SELECT path || dependency_id AS cycle
FROM dependency_path
WHERE module_id = dependency_id
AND path @> ARRAY[dependency_id];
字符串
6条答案
按热度按时间2ekbmq321#
您可以使用WITHRECURSIVE方法来检测循环,您可以修改查询以确保正确应用条件和联接。
字符串
u5rb5r592#
代码
from
中的点应更改为join
字符串
应改为
型
以确保正确执行联接。并且下一行应从
型
到
型
这个东西将确保条件被正确应用。通过这些更改,递归函数可以检测图中的循环。
chy5wohz3#
为了检测循环,使用此代码
字符串
xtfmy6hx4#
对于循环检测,此自定义查询将起作用:
字符串
该查询首先将a作为某个人的顶点,然后将B作为人的顶点,然后检查a和B是否相同,如果相同,则返回值。
上面的查询还将返回其中存在从节点到其自身的直接边的节点。
对于至少有两个节点的循环,我们可以使用以下查询。
型
tzxcd3kk5#
试试这段代码,可能对你有用。
字符串
qlvxas9a6#
查询不检测图形有几个原因,
1.定义依赖关系的表,请确保正确定义了关系。如果缺少任何依赖关系,则查询将不起作用。
1.确保您使用的PostgreSQL版本是正确的,并且支持所需的CTE递归语法。