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

Orientdb按边属性遍历时从每个路径获取最后一个顶点,orientdb,Orientdb,我需要遍历由边连接的所有顶点,其中属性“dependence”为“true” 这就是我到目前为止所做的: SELECT FROM (TRAVERSE * FROM (SELECT outE() FROM 9:5) WHILE (@class = 'E' AND dependence = 'yes') OR @class = 'V') WHERE @class = 'V' 虽然我不确定这是否是最好的方法,但这似乎只适用于边具有“依赖性”的路径 现在,可能会生成多个路

我需要遍历由边连接的所有顶点,其中属性“dependence”为“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,因为它检索了多个)

外部选择返回整个包的顶点,所以我想,也许用dependence='yes'查找没有传出边的顶点可以解决这个问题,尽管我不知道如何很好地完成

解决方案:

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

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

我通过构建下图尝试了一个示例

javascript函数“myFunction”有三个参数,分别是顶点、属性和值

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=[];
}
路径是A->D和A->B->C->G,然后将返回顶点D和G


以下是使用Allesandro图(dependent.value为0或1)对@sebastian的解决方案进行的稍微简化:


我认为您可以在OrientDB服务器函数下用Javascript编写自己的函数,然后从SQL调用它。我试着写它。我刚刚找到了一个解决方案,但我对你的方法很好奇,我会等待它看到javascript替代:)谢谢!谢谢你的回复。这很有趣,我不知道你能做到,尽管我觉得这太冗长了。我认为上面的OSql语句以更好的性能解决了这个问题,但注入javascript代码仍然是一件有趣的事情。尼斯:)
select expand(result) from (select myFunction("#9:0","dependence","yes") as result)
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]