【问题标题】:OrientDB - Create Edge using kind of self joinOrientDB - 使用自联接创建边缘
【发布时间】:2015-05-28 12:48:42
【问题描述】:

我已使用 OETL 从 RDMBS 将分层数据导入 OrientDB。在 RDBMS 中,我们曾经将 parentId 存储在同一行中。 例如表结构是这样的:

ID - 名称 - Parent_ID

公司 - 公司办公室 - 公司

D1 - 地区办事处 1 - 公司

D2 - 地区办事处 2 - 公司

SO1 - 小型办公室 1 - D1

SO2 - 小型办公室 2 - D2

SO3 - 小型办公室 3 - D1

现在每一行都是 Orientdb 中的一个节点。

我想创建一条边 (ParentOf),从说 Corp 到 D1,从 D1 到 SO1 等等。

如何编写查询来实现此目的?类似以下的东西?

create edge parentOf from (select from node)a to (select from node 其中 a.id = parent_id)

对不起,我还在考虑关系数据库的方式。

Orient DB 版本为 orientdb-community-2.0.9

【问题讨论】:

    标签: orientdb


    【解决方案1】:

    感谢 pembeci,以下是最终成功的函数:

    var db = orient.getGraph();
    var nodes = db.getVerticesOfClass("nodex");
    var itr = nodes.iterator();
    
    while(itr.hasNext()) {
       var vertex = itr.next();
       var id = vertex.getProperty("id");
       var children = db.getVertices("parent_id", id);
       var childItr = children.iterator();
    
       while(childItr.hasNext()) {
          var child = childItr.next();
          vertex.addEdge("parentOf", child);
       }
    }
    

    【讨论】:

      【解决方案2】:

      您不能将信息从第一个选择查询(从部分)传递到第二个查询(到部分)。所以你可能应该创建一个server side function。像这样的东西可能会起作用(我稍后会测试它,当我可以访问 Orient Studio 时):

      var db = orient.getGraph;
      var nodes = db.getVerticesOfClass("node");
      for (var i=0; i<nodes.length; i++) {
         var vertex = nodes[i]
         var id = vertex.getProperty("id");
         var children = db.getVertices("parent_id", id);
         for (var j=0; j<children.length; j++) {
            var child = children[j];
            vertex.addEdge("parentOf", child)
         }
      }
      

      【讨论】:

      • 非常感谢您的回复。我尝试了您的解决方案,但第一行本身给出了错误。我尝试只用一行“var db = orient.getGraph();”创建一个函数的代码。即使这样也行不通。它给出了 CannotfindfunctiongetGraph 错误。请注意,我在您的代码中添加了缺少的“()”。东方数据库版本 orientdb-community-2.0.9.
      • 这一行的函数 "var db = orient.getDatabase();"不过可以正常工作。
      • 2.0.9 wrt 函数中有一个错误。我必须下载 2.1 rc3,从旧数据库中导出数据,导入新数据库,修改你的函数以最终开始工作。 :)
      【解决方案3】:

      js 函数一直在运行。最后写了java代码来做到这一点:

              OrientGraph graph = new OrientGraph("remote:localhost/testNode", "root", "root");
      
              for (Vertex v : graph.getVerticesOfClass("Node")) 
              {
                  String id = v.getProperty("ID");    
      
                  System.out.println("Checking children of: " + id);
                  String sql = "select from node where PARENT_ID = '"+id+"'";
      
                  for (Vertex child : (Iterable<Vertex>) graph.command(
                          new OCommandSQL(sql))
                          .execute()) 
                  {
                      v.addEdge("parent_of", child);
                      System.out.println("\tAdded 'Parent Of' Edge from: " + id + " to " + child.getProperty("ID"));
      
                  }               
                  graph.commit();
              }
      

      【讨论】:

      • 很高兴能帮上忙。我想知道JS函数有什么问题。您是否需要使用迭代器或for 循环也可以工作?可能是迭代器在 JS 世界中出现了一个错误。
      • 哦,我也想知道 graph.commit() 是否会对 JS 代码产生影响。
      • 非常感谢您的帮助。我真的不确定为什么 js 函数要花这么多时间。它适用于少量数据,但对于 10k+ 个节点则需要很长时间。
      猜你喜欢
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多