当遍历边缘属性时,Orientdb从每个路径获取最后一个顶点

时间:2015-11-24 21:09:08

标签: orientdb

我需要遍历由属性'依赖'为'true'的边连接的所有顶点

这是我到目前为止所做的:

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

虽然我不确定是否是最好的方法,但这似乎只能在边缘有'依赖'='是'的路径上正常工作。

现在,可能会生成多个路径,我需要从每个路径/分支获取最后一个顶点。

traverserdVertex(-1) 应该返回最后一个,但是我猜这是来自整个遍历所以不好。 (看起来它有一个bug,因为它检索了多个)

外部 SELECT 返回整个顶点包,所以我想也许找到那些没有 dependent ='yes'的外向边缘的顶点可能会解决它,虽然我不确定如何做得很好。

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'))

这有效地返回每个分支的最后一个顶点。我对任何其他选项持开放态度,我想知道它是否可以改进。

2 个答案:

答案 0 :(得分: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 - &gt; D和A - &gt; B - &gt; C - &gt; G然后将返回椎骨D和G

enter image description here

答案 1 :(得分:0)

以下是@ sebastian解决方案的略微简化,使用Allesandro的图表(dependentOn.value为0或1):

jquery.jqGrid.js