Orientdb get last vertex from each path when Traversing by edge property

烂漫一生 提交于 2019-12-12 19:16:54

问题


I need to traverse all vertices that are connected by edges where the property 'dependence' is 'true'

This is what I have so far:

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

Although im not sure if is the best way to do it, this seems to work fine following only the paths where edges have 'dependence' = 'yes'.

Now, There could be more than one path generated, and I need to get the last vertex from each path/branch.

traverserdVertex(-1) should return the last one, but im guessing that is from the whole traversal so is no good. (and it looks like there's a bug because it retrieves more than one)

The outer SELECT returns the whole bag of vertices so I'm thinking that maybe finding the ones that doesn't have an outgoing edge with dependence='yes' might solve it, although I'm not sure how to do it nicely.

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

This effectively returns the last vertex from each branch. I'm open to any other option, I'm wondering if it could be improved.


回答1:


I tried with an example by building the following graph

The javascript function "myFunction" has three parameters which are ridVertex, property and value

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=[];
}

Using the following command

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

the paths are A -> D and A -> B -> C -> G and then will be returned the verteces D and G




回答2:


The following is a slight simplification of @sebastian's solution, using Allesandro's graph (with dependentOn.value being 0 or 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]       


来源:https://stackoverflow.com/questions/33903845/orientdb-get-last-vertex-from-each-path-when-traversing-by-edge-property

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!