これがまさにあなたが探しているものであるかどうかはわかりませんが、 Graphvizドットを使用して関係をモデル化/グラフ化することができます。.dotファイルの更新された内容は次のとおりです。説明のようになります。
digraph G {
compound = true // allow edges between clusters
subgraph cluster_ab {
rank = same;
A -> B -> A
}
A -> C [ltail=cluster_ab]
A -> D [ltail=cluster_ab]
A -> E [ltail=cluster_ab]
subgraph cluster_ef {
rank = same;
E -> F -> E
}
E -> G [ltail=cluster_ef]
E -> H [ltail=cluster_ef]
subgraph cluster_ei {
E -> I -> E
}
I -> J [ltail=cluster_ei]
I -> K [ltail=cluster_ei]
}
サンプルドット出力http://img21.imageshack.us/img21/6177/64094067.png
重複するクラスター(E->IおよびE->F)を作成できないため、これは少し異なります。しかし、Eと私が兄弟であることはそれほど明白ではありませんが、それはあなたが明確にした方法に似ていると思います-私もIからJ、Kにリンクする必要がありました、そうでなければ警告がありました少し醜く見えました。
Graphviz / dotとインターフェイスするライブラリはたくさんあり、私が行ったように手動ではなく、これらの種類のグラフを動的に生成できます。次に、有向グラフを保存/取得するためのライブラリがすでにある場合は、階層データの保存がほぼ完了しています。あなたがあなたの質問で述べたように、それが効率的であるかどうかに関しては...もちろん、あなたが保存しているデータの量に依存します。
@Kimがコメントで指摘しているように、兄弟を個々のノードではなくペアとして扱うことで、非常に単純化されたグラフを取得できます。
digraph G {
"A,B" -> C
"A,B" -> D
"A,B" -> E
"E,F" -> G
"E,F" -> H
"E,I" -> J
"E,I" -> K
}
これは私が完全に見落としていた明白でエレガントな解決策ですが、重複が発生した場合の兄弟関係については少しあいまいなままです(再びE)。
より単純なグラフhttp://img35.imageshack.us/img35/8969/so2b.png