2015-05-28 2 views
0

Я импортировал иерархические данные в OrientDB из RDMBS, используя OETL. В РСУБД мы использовали для хранения parentId в той же строке. , например. структура таблицы что-то вроде этого:OrientDB - Create Edge, используя вид самостоятельного присоединения

ID - Имя - PARENT_ID

Corp - Корпоративный офис - Corp

D1 - районное управление 1 - Corp

D2 - Районное отделение 2 - Corp

СЦ1 - Small Office 1 - D1

SO2 - Small Office 2 - D2

SO3 - Small Office 3 - Д1

Теперь каждая строка представляет собой узел в Orientdb.

Я хочу создать ребро (ParentOf) от сказать Corp до D1 и D1 до SO1 и так далее.

Как я могу написать запрос для достижения этого? Что-то вдоль линии следования?

создать краевую parentOf из (выберите из узла) а в (выбрать из узла где a.id = parent_id)

К сожалению, я все еще думаю, в реляционной БД пути.

Orient DB версия orientdb-сообщества 2.0.9

ответ

0

Функция js работала вечно. Наконец написал код Java для этого:

 OrientGraph graph = new OrientGraph("remote:localhost/testNode", "root", "root"); 

     for (Vertex v : graph.getVerticesOfClass("Node")) 
     { 
      String id = v.getProperty("ID");  

      System.out.println("Checking children of: " + id); 
      String sql = "select from node where PARENT_ID = '"+id+"'"; 

      for (Vertex child : (Iterable<Vertex>) graph.command(
        new OCommandSQL(sql)) 
        .execute()) 
      { 
       v.addEdge("parent_of", child); 
       System.out.println("\tAdded 'Parent Of' Edge from: " + id + " to " + child.getProperty("ID")); 

      }    
      graph.commit(); 
     } 
+0

Рад, что я могу помочь. Интересно, что не так с функцией JS. Нужно ли использовать итератор или цикл 'for', также будет работать? Может быть, у итератора есть ошибка, проявляющаяся в мире JS. – pembeci

+0

Ой, а также мне интересно, будет ли иметь значение 'graph.commit()' в JS-коде. – pembeci

+0

Большое спасибо за вашу помощь.Я действительно не знаю, почему функция js занимала столько времени. Он работал хорошо для небольшого объема данных, но навсегда оставался для узлов 10k +. – CapsLock

0

Вы не можете передавать информацию от первого запроса на выборку (от части) для второго запроса (в части). Поэтому вы должны создать server side function. Нечто подобное может работать (я проверить это позже, когда я буду иметь доступ к Orient Studio):

var db = orient.getGraph; 
var nodes = db.getVerticesOfClass("node"); 
for (var i=0; i<nodes.length; i++) { 
    var vertex = nodes[i] 
    var id = vertex.getProperty("id"); 
    var children = db.getVertices("parent_id", id); 
    for (var j=0; j<children.length; j++) { 
     var child = children[j]; 
     vertex.addEdge("parentOf", child) 
    } 
} 
+0

Большое спасибо за ответ. Я попробовал ваше решение, но сама первая строка дает ошибку. Я попытался создать функцию только с одной строкой "var db = orient.getGraph();" кода. Даже это не работает. Он дает ошибку CannotfindfunctiongetGraph. Обратите внимание, что я добавил отсутствующий «()» в вашем коде. Orient DB Version orientdb-community-2.0.9. – CapsLock

+0

Функция с этой строкой «var db = orient.getDatabase();» работает правильно, хотя. – CapsLock

+0

Ошибка в функциях 2.0.9 wrt. Мне пришлось загрузить 2.1 rc3, экспортировать данные из старого db, импортировать в новый db, изменить вашу функцию, чтобы наконец начать работать. :) – CapsLock

0

Благодаря pembeci, следующее это функция, которая, наконец, сделал трюк:

var db = orient.getGraph(); 
var nodes = db.getVerticesOfClass("nodex"); 
var itr = nodes.iterator(); 

while(itr.hasNext()) { 
    var vertex = itr.next(); 
    var id = vertex.getProperty("id"); 
    var children = db.getVertices("parent_id", id); 
    var childItr = children.iterator(); 

    while(childItr.hasNext()) { 
     var child = childItr.next(); 
     vertex.addEdge("parentOf", child); 
    } 
} 
Смежные вопросы