我试图找出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
答案 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来解决这个问题。但是,您没有指定数据库,并且并非所有数据库都支持它们。