2015-11-24 59 views
2

我需要遍歷由邊緣向財產「依賴」是「真」連接所有頂點Orientdb從每個路徑的邊緣屬性遍歷時,得到最後的頂點

這是我到目前爲止有:

SELECT 
FROM (TRAVERSE * 
     FROM (SELECT outE() FROM 9:5) 
     WHILE (@class = 'E' AND dependence = 'yes') OR @class = 'V') 
WHERE @class = 'V' 

雖然林不知道,如果是做到這一點的最好辦法,這似乎做工精細下面僅就這裏邊有「依賴」的路徑=「是」

現在,可能會生成多條路徑,我需要從每個路徑/分支中獲取最後一個頂點。

traverserdVertex(-1)應返回最後一個了,但是我猜是從整體遍歷所以也是白搭。 (它看起來像有一個錯誤,因爲它會檢索一個以上)

SELECT返回的頂點,所以我在想,也許發現的那些全包在沒有傳出邊緣與依賴='是'可能會解決它,但我不知道如何很好地做到這一點。

SOLUTION:

SELECT 
    FROM (TRAVERSE * 
      FROM (SELECT outE() FROM 9:5) 
      WHILE (@class = 'E' AND dependence = 'yes') OR @class = 'V') 
    WHERE @class = 'V' AND NOT (outE() contains (dependence='yes')) 

這有效地返回從每個分支的最後一個頂點。我願意接受任何其他選擇,我想知道是否可以改進。

+0

我想你可以使用JavaScript編寫下OrientDB服務器功能自己的函數,然後從SQL調用它。我試着寫它。 –

+0

我剛剛發現了一個解決方案,但我好奇你的方法,生病等待它看到javascript alternatve :)謝謝! – Sebastian

回答

2

我通過構建如下的圖

enter image description here

JavaScript函數「myFunction的」一示例試圖具有三個參數,這些參數ridVertex,屬性和值

var g=orient.getGraph(); 
var previous=[]; 
var currently=[]; 
var node=[]; 
var b=g.command("sql","select from v where @rid =" + ridVertex); 
if(b.length>0){ 
    previous.push(b[0]); 
    node.push(b[0]); 
    do{ 
     for(i=0;i<previous.length;i++){ 
     var edges=g.command("sql","select expand(outE()) from V where @rid = "+ previous[i].getId()); 
     var myVertex=[]; 
     for(j=0;j<edges.length;j++){ 
      var edge=edges[j]; 
      var dependence=edge.getProperty(property); 
      if(dependence==value){ 
       var vIn=edge.getProperty("in"); 
       myVertex.push(vIn); 
      } 
      } 
      if(myVertex.length>0){ 
      setPaths(); 
      } 
     } 
     change(); 
    }while(previous.length>0); 
} 
return node; 

function setPaths(){ 
    for (m = 0; m < node.length; m++) { 
     var lastId=node[m].getId().toString(); 
     var idOut=previous[i].getId().toString(); 
     if (lastId==idOut) { 
     for(r=0;r<myVertex.length;r++){ 
      var vertex=myVertex[r]; 
      node.push(vertex); 
      currently.push(vertex); 
     } 
     node.splice(m,1); 
     break; 
     } 
    } 
} 

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

使用下面的命令

select expand(result) from (select myFunction("#9:0","dependence","yes") as result) 

條的路徑是A - > d和A - >乙 - 「ç - > G和然後將返回verteces d和G

enter image description here

+0

感謝您的回覆。這很有趣,我不知道你可以做到這一點,儘管它看起來很冗長。我認爲上面的OSQL語句解決了它的更好的性能,但注意JavaScript代碼仍然是一件有趣的事情。好:) – Sebastian

0

以下是@ Sebastian的溶液輕微簡化,使用Allesandro的(隨dependentOn.value爲0或1):

select from 
    (TRAVERSE * FROM (select from Circle where name="A") 
    while (@CLASS="dependentOn" and value=1) OR @CLASS="Circle") 
where @CLASS='Circle' AND NOT (outE().value contains 1) 

----+-----+------+----+-------------- 
# |@RID |@CLASS|name|in_dependentOn 
----+-----+------+----+-------------- 
0 |#11:6|Circle|G |[#12:4]  
1 |#11:3|Circle|D |[#12:1]  
相關問題