2016-10-26 3 views
1

Я хотел бы пересечься из вершины, только следующие ребра, которые соответствуют определенному выражению (пример: friendsWith.type="bestFriend"). Как мне это сделать?OrientDB: перемещать только края с некоторым свойством

Кроме того, мне нужно запустить эту операцию для кучи вершин. Можно ли держать вещи организованными «головаю» обходов? В идеале было бы возвращение:

[[start1, [list of all the vertices during traversal], [start2, [...]],...]

+0

Не могли бы вы лучше объяснить, что вы хотите получить? Что должно быть start2? Не могли бы вы привести пример? –

+0

Могли бы вы принять функцию javascript? –

+0

@AlessandroRota фактически функция javascript будет очень полезна. – cgreen

ответ

1

Я пытался с этим графиком

enter image description here

Я использовал эту функцию яваскрипта с параметром избавиться

var g=orient.getGraph(); 
var nodes = []; 
var previous=[]; 
var currently=[]; 
var b=g.command("sql","select from " + rid); 
if(b.length>0){ 
    var vertex=b[0]; 
    previous.push(vertex); 
    nodes.push(vertex); 
    do{ 
     for(i=0;i<previous.length;i++){ 
      var vertexOut=previous[i]; 
      var edges=g.command("sql","select expand(outE('friendsWith')) from "+ vertexOut.getId()); 
      for(s=0;s<edges.length;s++){ 
       var edge=edges[s]; 
       var type= edge.getProperty("type"); 
       if(type=="bestFriend"){ 
        var vertices=g.command("sql","select expand(inV('friendsWith')) from "+ edge.getId()); 
        var vertex=vertices[0]; 
        var found=false;   
        for(k=0;k<nodes.length;k++){ 
         var id=nodes[i].getId(); 
         var id_v=vertex.getId() 
         if(id==id_v){ 
          found=true; 
          break; 
         } 
        } 
        if(found==false){ 
         currently.push(vertex); 
         nodes.push(vertex); 
        } 
       } 
      } 
     } 
     change(); 
    }while(previous.length>0); 
    return nodes; 
} 

function change(){ 
    previous=[]; 
    for (indice=0;indice<currently.length;indice++) 
     previous.push(currently[indice]); 
    currently=[]; 
} 

и с select expand(node) from (select myFunction("#9:0") as node) я получил

enter image description here

Надеюсь, это поможет.

+0

Это выглядит очень хорошо! Могу ли я спросить, ожидаете ли вы, что вызов этой функции в javascript на сервере будет значительно быстрее, чем запись локального скрипта в python (pyorient), который делает то же самое (т. Е. Вызывает команды SELECT и организует результаты). – cgreen

+0

Да, вы можете вызвать эту функцию в javascript на сервере –

+0

Я имею в виду, что функция JavaScript так же быстро, как SQL-вызов? Является ли скрипт python на стороне клиента медленнее, чем оба? – cgreen

0

попробовать это:

select outV().name as start, inV().name as end from(traverse * from friendsWith while type = "bestFriend") 

вы можете сделать это даже без траверсы.

Надеюсь, это поможет.

С уважением.

+0

Часть хода не работает для меня, разве это не должно быть 'traverse от '? Я пробовал «пересекать inE (« friendsWith ») с V, тогда как type =« bestFriend », но ничего не получал. – cgreen

+0

Я думаю, что вы ничего не получаете от траверсы inE ('friendsWith') от V, тогда как type = "bestFriend", потому что ваша вершина не имеет тип свойства –

+0

ОК, это имеет больше смысла - вы говорите, что я должен пересекать края вместо вершин, таким образом команда «while» дает вам свойства edge. Как вы могли сделать это с помощью SELECT? Скажем, всего два слоя вниз. Я знаю, что вы можете сделать «выбрать (« friendswith »). Out (« friendswith ») из E', но я не знаю, как указать свойства края там. – cgreen

Смежные вопросы