【问题标题】:Create Edges in OrientDB在 OrientDB 中创建边
【发布时间】:2016-06-13 05:26:31
【问题描述】:

我有一个东方数据库,其中包含来自不同管理工具的服务器的顶点。由于可以通过多个管理工具监视服务器,因此我想在同一服务器的顶点之间创建边。连接的组件将成为单独的服务器。

我遇到的问题是,不同的系统会有不同的命名约定——有些使用完全限定的域名,有些使用内部域名,有些只使用主机名。

我的样本数据:

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 个不同的命令(下面是伪代码),它们会产生下面的边缘

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

【问题讨论】:

  • 在您的第一个伪查询“从 Alpha 中选择,将名称作为 Beta.DomainName 的子字符串加入”中,您有边 #12:0 到 #13:0 边 #12:0 到 #14:0 边#13:0 到 #14:0 但 14:0 是 GAMMA 而不是 BETA。你能更好地解释你的需求吗?
  • @AlessandroRota ,抱歉,我原来是按连通分量对边进行排序,现在按运算排序
  • 嗨@Zeophilite,来源和目的地是否正确?
  • @LucaS ,边缘应该是双向的(或与方向无关)
  • 嗨@Zeophlite,你能接受Javascript函数吗?

标签: orientdb


【解决方案1】:

试试这个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+'');
    }
  }
}

这是输出:

希望对你有帮助。

问候

【讨论】:

  • 有没有办法在没有O(N^2) 复杂性的情况下做到这一点?
【解决方案2】:

您可以使用这些查询:

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%")

希望对你有帮助

【讨论】:

  • 嗨亚历山德罗,有没有办法通过不指定 "compute-n" 将其折叠成 3 个查询?类似于将第一个替换为:create edge from (select from Alpha) to (select from Beta where DomainName like Alpha.Name &amp; "%")
  • @Zeophlite 我不认为你可以用一个查询来做你想做的事情,你可以尝试使用 javascript 函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多