2015-06-04 5 views
1

OrientDB Server v2.0.10, Я пытаюсь найти запрос для следующего сценария.Запрос OrientDB для иерархических данных

У меня есть две иерархии: A-> B-> C и D-> E-> F Число узлов в иерархии может меняться. Узел в 1-й иерархии может быть подключен к другой иерархии, используя некоторое отношение: «Назначено». То, что я хочу, является родительским узлом второй иерархии, если есть какой-либо входящий фронт для любого из узлов этой 2-й иерархии с 1-го.

Например, у нас есть автомобиль-ребенок-> мотор-ребенок-> поршень и кантри-ребенок-> государство-ребенок-> город И отношения Made_In, которые связаны с автомобилем или двигателем или поршнем в любой стране или штате или Город Итак, если есть отношение к любой стране или государству или городу, страна должна быть возвращена. Пример, Engine1-Made_In-> Берлин, это вернет Германию. Извините за такой игрушечный пример. Надеюсь, это ясно.

Спасибо.

+0

Можете привести пример? – wolf4ood

+0

@ wolf4ood Я добавил пример в сообщение – lee

ответ

3

Вы должны рассмотреть возможность чтения главы о «пересечении» - это должно быть недостающее звено для ответа на ваш вопрос. Вы можете найти его здесь: http://orientdb.com/docs/last/SQL-Traverse.html

В принципе, если вы думаете о графике, как генеалогическое дерево, вы хотите достичь 3 вещи:

  • Найти все дети, внуки, гранд-внучатый дети (и так далее) из дерева 1 для данного члена семьи (= Hierarchy1)

  • Найти те, кто имеет отношение к членам другого генеалогического дерева (= НАЗНАЧЕНО)

  • Покажи мне, кто находится на вершине этого tree (= Hierarchy2)

Одним из возможных решений должно выглядеть немного что-то вроде этого:

Так как вы хотите, чтобы в конечном итоге на вершине hierarchy2, вы должны начать с другой стороны, то есть hierarchy1.

  1. Get hierarchy1 (сверху-вниз)

    TRAVERSE out("CHILD") FROM Car 
    
  2. Выбрать все отношения

    SELECT out("MADE_IN) FROM ([1]) 
    
  3. и от тех, идут снизу-вверх

    TRAVERSE in("CHILD") FROM ([2]) 
    
  4. Кто наверху?

    SELECT FROM ([3]) WHERE @class="Country" 
    

объединены в один SQL, это выглядит так уродливо, как это:

SELECT FROM (
     TRAVERSE in("CHILD") FROM (
      SELECT out("MADE_IN") FROM (
      TRAVERSE out("CHILD") FROM Car 
     ) 
     ) 
    ) WHERE @class="Country" 

Вы можете заменить автомобиль с любым @rid в hierarchy1, чтобы получить список стран, он или какой-либо части это было сделано.

Разумеется, могут быть лучшие решения. Но, по крайней мере, этот должен работать, поэтому я надеюсь, что это поможет.

+0

Это именно то, что мне нужно. Огромное спасибо. – lee