Самый эффективный способ получить все предшественники с помощью OrientDB

У меня "классическая" древовидная структура, смоделированная в OrientDB.

  • Один корневой узел, ROOT
  • несколько узлов с ROOT в качестве родителя, A, B, C, ... Эти узлы имеют исходящее отношение (с меткой «hasParent») к ROOT
  • Подузлы A1, A1, B1,... все с исходящими отношениями (с меткой "hasParent") к A, B,...

Я хочу запросить (в ОДНОМ запросе) конкретный узел на уровне 2 и получить всех предшественников наиболее эффективным способом.

У меня есть что-то вроде:

> traverse out('hasParent') from (select from category where code='B2')

Это самый эффективный способ сделать это?


person rmuller    schedule 14.10.2014    source источник


Ответы (1)


этот запрос достаточно эффективен ( O (logN), где N - количество узлов в классе «категория»), если у вас есть индекс, определенный для категории.код

В любом случае, если вы знаете RID B2 (предположим, что это # ​​10: 1), вы можете написать еще более быстрый запрос, например:

traverse out('hasParent') from #10:1

этот запрос имеет стоимость O (1) (постоянное время, не зависит от размера вашего графика, а только от размера набора результатов)

Все это конечно, если вы знаете, что у ROOT нет родителя, но если это не так и вы хотите ограничить глубину обхода, вы можете написать условие "пока" на обход, вот так

выйти ('hasParent') из # 10: 1, в то время как $ depth ‹ 3

person Luigi Dell'Aquila    schedule 21.10.2014