2016-06-13 112 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