根据关系在两个对象之间获取最短路径

时间:2015-01-31 15:38:14

标签: c# sql sorting

我试图找出SQL或C#中解决此问题的最佳方法。 假设我有一个大约50个左右的对象列表,每个对象都与另外两个对象有关。

Object 1.
ID: 1
Name:      Aspect1
Relation1: Aspect5
Relation2: Aspect7

Object 2.
ID:    2
Name:      Aspect2
Relation1: Aspect23
Relation2: Aspect50

Object 3
ID:   13
Name:      Aspect13
Relation1: Aspect5
Relation2: Aspect23

基本上我需要查看所有50个对象,然后找到将aspect1连接到aspect2的最短路径,方法是将它们连接到其他方面,并在它们之间至少有3个连接。

最终结果看起来像

aspect1 -- aspect5 -- aspect13 -- aspect23 -- aspect2

1 个答案:

答案 0 :(得分:0)

SQL没有针对此类问题进行优化。但是,您可以运行连续查询以尝试长度为4,5的路径,依此类推:

with relations as (
      select objectid as from_o, relation1 as to_o
      from objects
      union all
      select objectid, relation2
      from objects
     )
select *
from relations r1 join
     relations r2
     on r1.to_o = r2.from_o join
     relations r3
     on r2.to_o = r3.from_o join
     relations r4
     on r3.to_o = r4.from_o
where r1.objectid = 'Aspect1' and
      r4.objectid = 'Aspect2';

每个对象和50个对象只有两个关系,这对于短路径来说应该是一个可解决的问题。如果此查询未返回任何内容,您将继续以类似的方式添加联接。如果您的数据库不支持with,则可以使用子查询或视图来达到相同的效果。

有一种方法使用递归CTE来解决这个问题。但是,您没有指定数据库,并且并非所有数据库都支持它们。