単純な加重グラフがあります
A
1 / \\ 0.5
/ \\0.5
B C
これが家族を表し、Aが父親、Bが息子、Cが母親であるとします。Bが大学で勉強していて、Aが彼のためにアパートを購入したとしましょう。AはCと一緒に、50-50の一般所有の家に住んでいます。
Aから始めて、グラフをツリーに変換したいと思います。
- AはCが住んでいる場所の50%を所有しています
- AはBが住んでいる場所の100%を所有しています
- CはAが住んでいる場所の50%を所有しています
グラフと生成されたツリーはより複雑になる可能性がありますが、より一般的な図が得られることを願っています。
SQLServer2005では
Drop Table #graph;
Create Table #graph
(FirstVertex VarChar(1) Not Null,
SecondVertex VarChar(1) Not Null,
Weight float);
Insert #graph Values('A','B',1);
Insert #graph Values('A','C',0.5);
Insert #graph Values('C','A',0.5);
そして、次の一般的なテーブル式を使用して、「A」から始めてグラフをトラバースしています。
With GraphRecursion (FirstVertex, SecondVertex, Weight, Level)
As
(
Select FirstVertex, SecondVertex, Weight, 0 As Level
From #graph
Where FirstVertex='A'
Union all
Select a.FirstVertex, a.SecondVertex, a.Weight, b.Level+1
From #graph a
Inner Join GraphRecursion b
On a.FirstVertex=b.SecondVertex --And b.Level<=1
)
Select * From GraphRecursion;
これは〜をひき起こす
Msg 530, Level 16, State 1, Line 11
The statement terminated. The maximum recursion 100 has
been exhausted before statement completion.
コメントを外して再帰のレベルを制限するとAnd b.Level<=1
、期待どおりの結果が得られますが、実際の使用には明らかにあまり役立ちません。
上記の例でエッジ(つまり、FirstVertex、SecondVertexのペア)が繰り返されないように、前の反復を参照する方法はありますか?