使用SQL

时间:2016-07-20 23:05:15

标签: sql sql-server graph longest-path

我在SQL中将图表保存为两个名为Edge和Node的表:

Node table:
Id Name
10 A
11 B
12 C

Edge Table:
From To Weight
10 11 0.3
10 14 0.2
10 12 0.5
11 12 0.6
12 10 0.8

例如,从节点10到节点12的路径的一种可能解决方案如下:

From    To  Weight  Path
10  12  0.9 10,11,12

现在,我想找出图表节点之间最长的路径(对于任何可能的路径)。

我已经用负边缘改变了dijkstra并且它循环并且没有返回任何结果。

是否有任何程序或算法可以找到所需的结果?

1 个答案:

答案 0 :(得分:0)

最近我遇到了类似的问题并试图find the longest path using SQL recursive CTE query。请参阅给定的文章。

我尝试针对您的问题修改上述解决方案,并获取所有可能路径的列表,如以下输出屏幕所示

enter image description here

如果这是您想要获得的结果,我可以继续在SQL Server上描述我的解决方案

引用的SQL查询计算给定两个节点的最长路径。 首先,我们需要定义所有可能的起始和目标节点

以下查询列出了所有可能集合的组合

select Nodes_From.Id as [From], Nodes_To.Id as [To]
from LongestPath_Nodes as Nodes_From
inner join LongestPath_Nodes as Nodes_To
    on Nodes_From.Id <> Nodes_To.Id

请注意,这不包括“14”,因为它不在节点表中(因此实际上在给定的测试数据中存在一致性问题)

因此,通过创建SQL cursor,我可以遍历每个节点集(从 - 节点组合)并执行存储过程,其中包括计算给定两个节点的最长路径的SQL代码

我还创建了一个表来存储路径的总重量

Create Table LongestPath_Routes ([weight] decimal(10,1), path varchar(100))

如下面的SQL脚本所示,我在开头清除了这个表。 然后为存储过程中的每个从 - 到节点集填充它 最后在光标执行完成后,我通过按最大路径的权重列排序查询表(也可以是最短路径)

truncate table LongestPath_Routes

DECLARE @From TinyInt
DECLARE @To TinyInt

DECLARE PathCursor CURSOR FAST_FORWARD FOR
    select Nodes_From.Id as [From], Nodes_To.Id as [To]
    from LongestPath_Nodes as Nodes_From
    inner join LongestPath_Nodes as Nodes_To
        on Nodes_From.Id <> Nodes_To.Id

OPEN PathCursor

FETCH NEXT FROM PathCursor INTO @From, @To

WHILE @@FETCH_STATUS = 0
BEGIN
set nocount on
 EXEC LongestPath_Calculate_for_Nodes @From, @To
set nocount off

 FETCH NEXT FROM PathCursor INTO @From, @To
END

CLOSE PathCursor
DEALLOCATE PathCursor 

select * from LongestPath_Routes order by [weight] desc

我希望这个解决方案可以帮助你