如何在postgresql中有效地遍历节点?

公园

我正在尝试使用 PostgreSQL 中的递归子句从特定节点遍历节点。(顺便说一句,我是 Postgresql 的新手)这是我的 db 表的一个简单版本:

 table: nodes
|--------------|------------------|
|      id      |     node_name    |
|--------------|------------------|
|      1       |         A        |
|--------------|------------------|
|      2       |         B        |
|--------------|------------------|
|      3       |         C        |
|--------------|------------------|
|      4       |         D        |
|--------------|------------------|
|      5       |         E        |


table: links
|--------------|---------------------|-----------------|
|      id      |        id_from      |      id_to      |
|--------------|---------------------|-----------------|
|      1       |           1         |         2       |
|--------------|---------------------|-----------------|
|      2       |           1         |         3       |
|--------------|---------------------|-----------------|
|      3       |           2         |         4       |
|--------------|---------------------|-----------------|
|      4       |           3         |         4       |
|--------------|---------------------|-----------------|
|      5       |           4         |         5       |

所以,这只是这个简单的直接图。(所有边缘从左到右)

    B
  /   \
 A     D - E
  \   /
    C

在这种情况下,从 A 开始获取所有可以访问的顶点的有效方法是什么?

我试过的:

在 SQL (PostgreSQL) 中的简单图搜索算法中找到的 dfs 解决方案

with recursive graph(node1, node2, path) as
(
    select id_from, id_to, ARRAY[id_from] from links
        where id_from = 1
    union all
    select nxt.id_from, nxt.id_to,array_append(prv.path, nxt.id_from)
    from links nxt, graph prv
    where nxt.id_from = prv.node2
    and nxt.id_from != ALL(prv.path)
)
select * from graph

它给了我几乎所有的路径。但它访问了 D 顶点两次。(执行 D -> E 逻辑两次)我想忽略访问的顶点以提高效率。

那么,我怎样才能做到这一点?提前致谢!

超人

事情没那么简单。在单个查询中,所有递归路径都是完全独立的。因此,每条路径都不知道兄弟路径上发生了什么。它不知道某个节点已经被兄​​弟节点访问过。

因为 SQL 查询不支持某种全局变量,所以不可能在递归路径之间以这种方式共享此类信息。

我建议编写一个函数,您可以在其中使用 plsql 语法,以更“常见的编程”方式解决问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在PostgreSQL中有效地计算滚动总和

来自分类Dev

如何在 Matlab 中有效地计算单个有限差分?

来自分类Dev

如何在R中有效地附加列表的所有元素

来自分类Dev

如何在R中有效地联接具有多个主键的表?

来自分类Linux

如何在带有短句的大型数据集中有效地使用spacy?

来自分类Dev

如何在Rails中有效地对模型进行评分并获取其平均评分

来自分类Dev

如何在Ruby中有效地连接多个阵列?

来自分类Java

如何在Java中有效地合并两个列表?

来自分类Java

如何在Java中有效地洗牌2D名单?

来自分类Dev

如何在JavaScript中有效地组合多个Maybe monad?

来自分类Dev

如何在python中有效地搜索列表

来自分类Dev

如何在python中有效地搜索列表?

来自分类Dev

如何在python中有效地将字典中的值分组

来自分类Dev

如何在python中有效地对列表进行分类

来自分类Dev

如何在Go中有效地串联字符串

来自分类Dev

如何在Unity中有效地对很多RGB颜色进行排序

来自分类Dev

如何在Rails中有效地更新多个实例

来自分类Dev

如何在C#中有效地并行执行多个异步调用?

来自分类Dev

如何在Julia中有效地初始化巨大的稀疏数组?

来自分类Dev

如何在Haskell中有效地写入大文件

来自分类Dev

如何在熊猫中有效地加入/合并/连接大数据框?

来自分类Dev

如何在Dask中有效地从DataFrame转到多个Series?

来自分类Dev

如何在iOS中有效地创建列表

来自分类Dev

MySQL:如何在其他查询中有效地重用查询的结果?

来自分类Dev

如何在Python中有效地将参数解译到数据库

来自分类Java

如何在ProtoBuf中有效地建模HashMap / Dictionary

来自分类Dev

如何在python类列表中有效地创建编号列表

来自分类Dev

如何在 Crystal 中有效地操作二進制數?

来自分类Dev

如何在javascript中有效地匹配字符串中间的数字?

Related 相关文章

  1. 1

    在PostgreSQL中有效地计算滚动总和

  2. 2

    如何在 Matlab 中有效地计算单个有限差分?

  3. 3

    如何在R中有效地附加列表的所有元素

  4. 4

    如何在R中有效地联接具有多个主键的表?

  5. 5

    如何在带有短句的大型数据集中有效地使用spacy?

  6. 6

    如何在Rails中有效地对模型进行评分并获取其平均评分

  7. 7

    如何在Ruby中有效地连接多个阵列?

  8. 8

    如何在Java中有效地合并两个列表?

  9. 9

    如何在Java中有效地洗牌2D名单?

  10. 10

    如何在JavaScript中有效地组合多个Maybe monad?

  11. 11

    如何在python中有效地搜索列表

  12. 12

    如何在python中有效地搜索列表?

  13. 13

    如何在python中有效地将字典中的值分组

  14. 14

    如何在python中有效地对列表进行分类

  15. 15

    如何在Go中有效地串联字符串

  16. 16

    如何在Unity中有效地对很多RGB颜色进行排序

  17. 17

    如何在Rails中有效地更新多个实例

  18. 18

    如何在C#中有效地并行执行多个异步调用?

  19. 19

    如何在Julia中有效地初始化巨大的稀疏数组?

  20. 20

    如何在Haskell中有效地写入大文件

  21. 21

    如何在熊猫中有效地加入/合并/连接大数据框?

  22. 22

    如何在Dask中有效地从DataFrame转到多个Series?

  23. 23

    如何在iOS中有效地创建列表

  24. 24

    MySQL:如何在其他查询中有效地重用查询的结果?

  25. 25

    如何在Python中有效地将参数解译到数据库

  26. 26

    如何在ProtoBuf中有效地建模HashMap / Dictionary

  27. 27

    如何在python类列表中有效地创建编号列表

  28. 28

    如何在 Crystal 中有效地操作二進制數?

  29. 29

    如何在javascript中有效地匹配字符串中间的数字?

热门标签

归档