我只是想在Postgresql中使用递归CTE学习图遍历。
下面是我的数据集:
我正在使用以下代码来获取路径以及现有的列(节点和边)。 它给了我输出,但是path列不是ARRAY格式。
;WITH RECURSIVE CTE AS
(
SELECT NODE,EDGES,ARRAY[G.NODE]::TEXT AS PATH,1 AS LEVEL
FROM property_graph G
UNION ALL
SELECT G.NODE,G.EDGES,C.PATH || G.NODE,LEVEL + 1
FROM property_graph G
INNER JOIN CTE C ON G.NODE = ANY(C.EDGES)
WHERE G.NODE <> ALL(STRING_TO_ARRAY(C.PATH,'')) --Cond added to avoid cyclic graph
)
SELECT NODE,EDGES,PATH,LEVEL
FROM CTE
ORDER BY NODE,LEVEL;
你们能帮我吗?
谢谢。
答案 0 :(得分:0)
问题在于您的PATH
列的类型为TEXT
,NODE
的类型也是如此,因此||
运算符执行的是字符串串联而不是数组串联。
您应将PATH
列的类型从TEXT
更改为TEXT[]
(然后可以在STRING_TO_ARRAY
子句中删除WHERE
。 / p>
例如:
WITH RECURSIVE CTE AS
(
SELECT NODE,EDGES,ARRAY[G.NODE]::TEXT[] AS PATH,1 AS LEVEL
FROM property_graph G
UNION ALL
SELECT G.NODE,G.EDGES,C.PATH || ARRAY[G.NODE]::TEXT[],LEVEL + 1
FROM property_graph G
INNER JOIN CTE C ON G.NODE = ANY(C.EDGES)
WHERE G.NODE <> ALL(C.PATH) --Cond added to avoid cyclic graph
)
SELECT NODE,EDGES,PATH,LEVEL
FROM CTE
ORDER BY NODE,LEVEL;