我不确定这是否正是您要寻找的,但您可以使用Graphviz dot来建模/绘制关系。这是 .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