使用递归CTE进行Postgresql节点遍历

时间:2020-06-11 17:03:41

标签: postgresql

我只是想在Postgresql中使用递归CTE学习图遍历。

下面是我的数据集:

enter image description here

我正在使用以下代码来获取路径以及现有的列(节点和边)。 它给了我输出,但是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;

输出: enter image description here

你们能帮我吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

问题在于您的PATH列的类型为TEXTNODE的类型也是如此,因此||运算符执行的是字符串串联而不是数组串联。

您应将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;