循环检测递归查询在Apache-AGE和PostgreSQL中不起作用

doinxwow  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(6)|浏览(145)

我正在尝试使用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];

字符串

2ekbmq32

2ekbmq321#

您可以使用WITHRECURSIVE方法来检测循环,您可以修改查询以确保正确应用条件和联接。

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
  JOIN dependencies d ON dp.dependency_id = d.module_id
  WHERE 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];

字符串

u5rb5r59

u5rb5r592#

代码from中的点应更改为join

FROM dependency_path dp, dependencies d

字符串
应改为

JOIN dependencies d ON dp.dependency_id = d.module_id


以确保正确执行联接。并且下一行应从

AND NOT (dp.path @> ARRAY[d.dependency_id])


WHERE NOT (dp.path @> ARRAY[d.dependency_id])


这个东西将确保条件被正确应用。通过这些更改,递归函数可以检测图中的循环。

chy5wohz

chy5wohz3#

为了检测循环,使用此代码

MATCH path=(n)-[*]->(n)
RETURN path

字符串

xtfmy6hx

xtfmy6hx4#

对于循环检测,此自定义查询将起作用:

Match (a:Person)-[:relationship]-(b:Person)
where a=b

字符串
该查询首先将a作为某个人的顶点,然后将B作为人的顶点,然后检查a和B是否相同,如果相同,则返回值。
上面的查询还将返回其中存在从节点到其自身的直接边的节点。
对于至少有两个节点的循环,我们可以使用以下查询。

Match (a:Person)-[:relationship*2..]-(b:Person)
where a=b

tzxcd3kk

tzxcd3kk5#

试试这段代码,可能对你有用。

WITH RECURSIVE dependency_path AS (
  SELECT module_id, dependency_id, ARRAY[module_id, dependency_id] AS path
  FROM dependencies
  UNION ALL
  SELECT dp.module_id, d.dependency_id, path || d.dependency_id
  FROM dependency_path dp
  JOIN dependencies d ON dp.dependency_id = d.module_id
  WHERE NOT dp.path @> ARRAY[d.dependency_id]
)
SELECT path AS cycle
FROM dependency_path
WHERE module_id = dependency_id;

字符串

qlvxas9a

qlvxas9a6#

查询不检测图形有几个原因,
1.定义依赖关系的表,请确保正确定义了关系。如果缺少任何依赖关系,则查询将不起作用。
1.确保您使用的PostgreSQL版本是正确的,并且支持所需的CTE递归语法。

相关问题