嘗試此查詢:
traverse both() from YourClass while both('your_edge_class').size() = 0 and $depth <= 25
所以導線不會將連接到邊緣頂點/你指定的邊緣
編輯:
考慮下面的圖形示例,假設您不希望邊緣type1
和type2
,您想要將節點1,2,3,4,5和8連接到邊緣type 3
還是要避免所有頂點也連接到type 1
和type 2
?
編輯:
您可以使用此javascript函數有三個參數(RID,MAXDEPTH,excludeEdges)
var g=orient.getGraph();
var result=[];
var current=[];
var next=[];
var listEdges=excludeEdges.substring(1,excludeEdges.length-1).split(",");
var root=g.command('sql','select from '+rid);
current.push(root[0]);
var step=1;
while(current.length>0 && step<=maxDepth){
for(i=0;i<current.length;i++){
getVertex(current[i],"OUT");
getVertex(current[i],"IN");
}
change();
step++;
}
return result;
function change(){
current=[];
for (index=0;index<next.length;index++)
current.push(next[index]);
next=[];
}
function getVertex(start,direction){
var edgeDir="outE()";
var reverseDirection="in";
if(direction=="IN"){
edgeDir="inE()";
reverseDirection="out";
}
var edges=g.command("sql","select expand("+edgeDir +") from "+start.getId());
for(h=0;h<edges.length;h++){
var found=false;
for(m=0;m<listEdges.length;m++){
if(edges[h].getProperty("@class")==listEdges[m]){
found=true;
break;
}
}
if(found==false){
var vertex=g.command("sql","select expand("+ reverseDirection + ") from " +edges[h].getId());
for(j=0;j<result.length;j++){
if(result[j].getId().toString().equals(vertex[0].getId().toString()) ||
vertex[0].getId().toString().equals(rid)){
found=true;
break;
}
}
if(found==false){
result.push(vertex[0]);
next.push(vertex[0]);
}
}
}
}
使用以下命令
select expand(result) from (select myFunction("#9:1",25,"[type1,type2]") as result)
這似乎是一個錯誤,你應該在http://orientdb.com/docs/2.1/SQL-Traverse文件中正式發行跟蹤 –
頁面的問題.html表示給定的查詢在語法上是正確的,所以2.1.7(或至少我使用的版本)顯然是不足的。然而,似乎可行的解決方法是在WHILE條件中包含對$ depth的約束(例如'WHILE ...和$ depth <= 25'),而不是使用MAXDEPTH。 – peak
@LuigiD謝謝,會做 – kfresh