C# 根据两个对象之间的关系获取两个对象之间的最短路径
我正试图用SQL或C#找出解决这个问题的最佳方法。 假设我有一个大约50个对象的列表,每个对象都与另外两个对象相关C# 根据两个对象之间的关系获取两个对象之间的最短路径,c#,sql,sorting,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 R
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
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个对象,对于短路径而言,这应该是一个可解决的问题。如果这个查询没有返回任何内容,您将继续以类似的方式添加联接。如果您的数据库不支持带有的,则可以使用子查询或视图来实现相同的效果
有一种方法使用递归CTE来解决这个问题。但是,您没有指定数据库,也不是所有的数据库都支持它们。@GordonLinoff,为什么这么难?@GordonLinoff,是的,但是对于这里提供的部分问题,您已经在您的博文中回答了(顶点数不多,连接数固定),另一方面是。@HamletHakobyan。我在考虑访问所有顶点的最短路径,而不是连接其中两个顶点。@GordonLinoff,你是什么意思?@HamletHakobyan听起来他把它看作是旅行推销员的问题,而不是最短路径问题。@beefwipe。如果要确保较短的路径不会干扰,请在where
子句中添加r2.objectid'Aspect2'和r3.objectid'Aspect3'
。