2016-06-13 109 views
2

我有一個Orient數據庫,其頂點用於來自不同管理工具的服務器。由於服務器可以通過多個管理工具進行監控,因此我希望在同一臺服務器的頂點之間創建邊緣。連接的組件將成爲單獨的服務器。在OrientDB中創建邊緣

我遇到的問題是不同的系統會有不同的命名約定 - 有些使用完全限定域名,有些使用內部域名,有些使用主機名。

我的示例數據:

orientdb {db=audit}> select * from V 

+----+------+-------+----------+----------------------+----------------+ 
|# |@RID |@CLASS |Name  |DomainName   |LocalName  | 
+----+------+-------+----------+----------------------+----------------+ 
|0 |#12:0 |Alpha |compute-1 |null     |null   | 
|1 |#12:1 |Alpha |compute-2 |null     |null   | 
|2 |#12:2 |Alpha |compute-3 |null     |null   | 
|3 |#13:0 |Beta |null  |compute-1.example.com |null   | 
|4 |#13:1 |Beta |null  |compute-2.example.com |null   | 
|5 |#14:0 |Gamma |null  |null     |compute-1.local | 
|6 |#14:1 |Gamma |null  |null     |compute-3.local | 
+----+------+-------+----------+----------------------+----------------+ 

預期輸出:

我期望3個不同的命令(下面pseudocoded),這將產生下面的邊緣

Alpha to Beta: 
    Select from Alpha, join Name as a substring of Beta.DomainName 

    edge between #12:0 and #13:0 
    edge between #12:1 and #13:1 

Alpha to Gamma: 
    Select from Alpha, join Name & ".local" with Gamma.LocalName 

    edge between #12:0 and #14:0 
    edge between #12:2 and #14:1 

Beta to Gamma: 
    Select LocalName from Gamma, remove ".local" suffix, join as a substring of Beta.DomainName 

    edge between #13:0 and #14:0 
+0

在你的第一個pseudoquery 「從阿爾法選擇,加入名稱爲Beta.DomainName的子串」 你有 邊緣#12:0〜#13:0 邊緣#12:0〜#14 :0 邊緣#13:0至#14:0 但是14:0是GAMMA而不是BETA。 你能解釋一下你的需求嗎? –

+0

@AlessandroRota,道歉,我最初通過連接組件排序邊緣,我現在通過操作 – Zeophlite

+0

對它們進行了排序嗨@Zeophilite,源和目標是否正確? – LucaS

回答

1

您可以使用這些查詢:

create edge from (select from Alpha where Name="compute-1") to (select from Beta where DomainName like "compute-1%") 
create edge from (select from Alpha where Name="compute-2") to (select from Beta where DomainName like "compute-2%") 

create edge from (select from Alpha where Name="compute-1") to (select from Gamma where LocalName like "compute-1%") 
create edge from (select from Alpha where Name="compute-3") to (select from Gamma where LocalName like "compute-3%") 

create edge from (select from Beta where DomainName like "compute-1%") to (select from Gamma where LocalName like "compute-1%") 

希望它可以幫助

+0

嗨亞歷山德羅,沒有辦法通過不指定「計算-n」將它摺疊成3個查詢嗎?比如用下面的代替第一個:'從(從Alpha中選擇)創建邊緣(從Beta中選擇其中的域名如Alpha.Name&「%」)# – Zeophlite

+0

@Zeophlite我不認爲你可以做你想做的事情一個單一的查詢,你可以嘗試一個JavaScript函數 –

2

試試這個js函數:

var db = orient.getGraph(); 
var a = db.command('sql','select from Alpha'); 
var b = db.command('sql','select from Beta'); 
var g = db.command('sql','select from Gamma'); 

//Alpha to Beta 
for(i=0;i<b.length;i++) 
{ 
    var name = a[i].getRecord().field('Name'); 
    var Arid = a[i].getRecord().field('@rid'); 
    for(j=0;j<b.length;j++) 
    { 
    var dn = b[j].getRecord().field('DomainName').substring(0,name.length); 
    var Brid = b[j].getRecord().field('@rid'); 
    if(name==dn) 
    { 
     db.command('sql','create edge E from '+Arid+' to '+Brid+''); 
    } 
    } 
} 

//Alpha to Gamma 
for(i=0;i<a.length;i++) 
{ 
    var name = a[i].getRecord().field('Name'); 
    var Arid = a[i].getRecord().field('@rid'); 
    for(j=0;j<g.length;j++) 
    { 
    var ln = g[j].getRecord().field('LocalName').substring(0,name.length); 
    var Grid = g[j].getRecord().field('@rid'); 
    if(name==ln) 
    { 
     db.command('sql','create edge E from '+Arid+' to '+Grid+''); 
    } 
    } 
} 

//Beta to Gamma 
for(i=0;i<b.length;i++) 
{ 
    var name = b[i].getRecord().field('DomainName').substring(0,9); 
    var Brid = b[i].getRecord().field('@rid'); 
    for(j=0;j<g.length;j++) 
    { 
    var n = g[j].getRecord().field('LocalName').substring(0,name.length); 
    var Grid = g[j].getRecord().field('@rid'); 
    if(name==n) 
    { 
     db.command('sql','create edge E from '+Brid+' to '+Grid+''); 
    } 
    } 
} 

這是輸出:

enter image description here

希望它能幫助。

問候

+0

有沒有辦法做到這一點,而不''O(N^2)'複雜? – Zeophlite