Orientdb按边属性遍历时从每个路径获取最后一个顶点
我需要遍历由边连接的所有顶点,其中属性“dependence”为“true” 这就是我到目前为止所做的: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' 虽然我不确定这是否是最好的方法,但这似乎只适用于边具有“依赖性”的路径 现在,可能会生成多个路
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]