【发布时间】:2011-03-10 19:36:19
【问题描述】:
给定一个在有向图中保存边的表格,如下所示:
CREATE TABLE edges (
from_here int not null,
to_there int not null
)
获取特定节点的不同无向链接数量的最佳方法是什么?没有任何重复的有向边,也没有任何节点直接链接到自己,我只是想避免计算重复的无向边(例如(1,2)和(2,1))两次。
这可行,但 NOT IN 对我来说很难闻:
SELECT COUNT(*)
FROM edges
WHERE from_here = 1
OR (to_there = 1 AND from_here NOT IN (
SELECT to_there
FROM edges
WHERE from_here = 1
))
PostgreSQL 特定的解决方案可以解决这个问题。
【问题讨论】:
-
每条边都有互惠边吗?即,对于每个
(1,2),必须存在一个(2,1)? -
@Thomas:不,directed-edge-(1,2) 并不意味着directed-edge-(2,1),这两个有向边都可能出现,但只有一个是必要的。像 {(1,2),(1,3),(2,1)} 这样的边集应该产生 2 的计数(即取消对边的定向、折叠重复项、计算相关节点的无向度)。跨度>
-
好的。那么我的第二个解决方案应该会给你你想要的。
标签: sql postgresql directed-graph