【问题标题】:Postgresql node traversal using Recursive CTE使用递归 CTE 的 Postgresql 节点遍历
【发布时间】:2020-06-11 17:03:41
【问题描述】:

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

以下是我的数据集:

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

输出:

你们能帮帮我吗?

提前致谢。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    问题是您的PATH 列是TEXT 类型,NODE 也是,因此|| 运算符执行字符串连接而不是数组连接。

    您应该将PATH 列的类型从TEXT 更改为TEXT[](然后您可以删除WHERE 子句中的STRING_TO_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 || 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;
    

    【讨论】:

    • 感谢您重播,但出现以下错误 ERROR: operator does not exist: text[] ||字符变化第 6 行:SELECT G.NODE,G.EDGES,C.PATH || G.NODE,LEVEL + 1
    • 联合所有选择 G.NODE,G.EDGES,C.PATH || ARRAY[G.NODE]::TEXT[],LEVEL + 1...有了这些更改...它对我有用
    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2012-12-12
    • 2011-10-02
    • 2014-03-24
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多