【问题标题】:Orientdb get last vertex from each path when Traversing by edge propertyOrientdb通过边缘属性遍历时从每个路径中获取最后一个顶点
【发布时间】:2015-11-24 21:09:08
【问题描述】:

我需要遍历属性“dependence”为“true”的边连接的所有顶点

这是我目前所拥有的:

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

虽然我不确定是否是最好的方法,但这似乎只在边缘具有 'dependence' = 'yes' 的路径之后工作正常

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

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

外部 SELECT 返回整个顶点包,所以我在想也许可以找到那些没有输出边缘的顶点 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'))

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

【问题讨论】:

  • 我认为您可以在 OrientDB Server 函数下用 Javascript 编写自己的函数,然后从 SQL 调用它。我试着写。
  • 我刚刚找到了一个解决方案,但我对你的方法很好奇,我等着看 javascript 替代方案 :) 谢谢!

标签: orientdb


【解决方案1】:

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

javascript函数“myFunction”有ridVertex、property和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=[];
}

使用以下命令

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

路径是 A -> D 和 A -> B -> C -> G 然后将返回顶点 D 和 G

【讨论】:

  • 感谢您的回复。这很有趣,我不知道你能做到这一点,尽管它看起来对我来说很冗长。我认为上面的 OSql 语句以更好的性能解决了它,但仍然是一个有趣的事情要记住,注入 javascript 代码。不错:)
【解决方案2】:

以下是对@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]       

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多