Я не уверен, что это именно то, что вы ищете, но вы можете использовать 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