我有一个表,其中每个条目都是一个节点,并且该表包含每个节点与其他节点的直接连接。我希望为每个节点创建一个包含链中所有节点的列的视图,而不仅仅是节点本身连接到的节点。
一个示例是从下表的前两列生成“链中的节点”列:
CREATE TABLE example
(
node text,
connections text[],
nodes_in_chain text[]
)
INSERT INTO example VALUES
('a', ARRAY['a','b'], null),
('b', ARRAY['a','b','c','d'], null),
('c', ARRAY['b','c'], null),
('d', ARRAY['b','d'], null),
('e', ARRAY['e','f'], null),
('f', ARRAY['e','f'], null);
Node Connections Nodes in Chain
"a" "{a,b}" "{a,b,c,d}"
"b" "{a,b,c,d}" "{a,b,c,d}"
"c" "{b,c}" "{a,b,c,d}"
"d" "{b,d}" "{a,b,c,d}"
"e" "{e,f}" "{e,f}"
"f" "{e,f}" "{e,f}"
这是真正问题的一个小简化版本。如果我能解决这个例子,全表应该没问题。
该表的数据可以通过以下方式可视化:
我研究了几种不同的方法来解决这个问题。我研究了递归 CTE,但我没有设法让它们工作。
每个节点都连接到当前在数据库中的自身。如果有必要,在数据库中删除与自身的连接不是问题。
问题可能不必要的背景:
这个问题的根源来自试图识别交通中的车辆。原始数据库包含给定区域内每个时间步 t 的车辆位置和速度。目标是确定在红绿灯处花费的时间。为了解决这个问题,确定了交通信号灯的停车区域。该区域内每辆速度低于某个阈值的车辆都被认为正在等待红绿灯。然而,由于排长队,车辆可能在该区域外排队。因此,一条交通线(“节点链”)由所有彼此相距一定距离内且速度较低的车辆组成。从识别的队列区域内的车辆开始。这个问题是对飞机滑行时间的科学研究的一部分。
我首先使用 Python 和 pandas 执行计算以识别区域内的车辆。然而,代码的运行时间要长 10 倍,这使得该项目望而却步。该代码非常简单,无需手动引入循环,因此无法加速(我相信)。我还将比较在 Python 和 PostgreSQL 中执行排队算法的速度。
方法一:
乍一看,我似乎可以应用一个基本解决方案,因为根据您的示例数据,每个连接都包含在另一个连接中。
方法二:
但是,正如@ypercube指出的那样,如果连续有 3 个或更多线性点,则此解决方案不起作用。
例如:e -> f -> g -> h
作为解决此问题的参考,我使用了另一个相关问题中的答案:
它使用一种称为传递闭包的方法来解决问题。
首先让我通过添加 4 个节点的线性连接来更改您的示例数据。
现在应用数学:
给我们这个结果:
db<>在这里摆弄