【问题标题】:Importing from RDBMS to OrientDB: load edges only从 RDBMS 导入 OrientDB:仅加载边
【发布时间】:2016-02-29 12:55:59
【问题描述】:

使用社区版 2.1.11

我在互联网上看到了一些类似的问题(例如,import edges to OrientDB using etl 或 orient-database.narkive.com/d8c4b82y/orientdb-etl-edge-creation-help),但还没有真正解决。

我正在实施航班连接搜索系统。我有带有两个相关表的 RDBMS (SQL Server) - 位置和航班。每个航班都有两个 locationID - locationFrom 和 locationTo。

当我将其导入图表时,我希望将位置视为顶点,将航班连接为边。正如我从手册中了解到的(从 DBMS 导入,由于新手限制,我不能发布两个以上的链接......),我应该为此编写两个不同的 JSON 并通过 ETL 运行它们。所以,我可以用这段代码毫无问题地导入位置:

    {
  "config": {
    log : "debug"
  },
  "extractor" : {
    "jdbc": { "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver",
              "url": "jdbc:sqlserver://localhost:1434;databaseName=mydb;integratedSecurity=true;",
              "userName": "root",
              "userPassword": "root",
              "query": "select * from locations" }
  },

  "transformers" : [
    { "vertex": { "class": "Location"} }
  ],
   "loader" : {
    "orientdb": {
      "dbURL": "plocal:C:\orientdb-community-2.1.11\databases\Test",
      dbUser: "admin",
      dbPassword: "admin",
      dbAutoDropIfExists: false,
      dbAutoCreate: true,
      tx: false,
      wal: false,
      batchCommit: 1000,
      dbType: "graph",
      indexes: [{class:"Location", fields:["id:string"], type:"UNIQUE_HASH_INDEX" }]
    }
  }
}

但是当我尝试导入航班时,我遇到了一个问题,即使在 Google 的帮助下我也无法解决:ETL 不想只导入边。作为第一个直观的目的,我写了这样的东西:

{
  "config": {
    log : "debug"
  },
  "extractor" : {
    "jdbc": { "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver",
              "url": "jdbc:sqlserver://localhost:1434;databaseName=mydb;integratedSecurity=true;",
              "userName": "root",
              "userPassword": "root",
              "query": "select * from flights" }
  },

  "transformers" : [
    { "edge": { "class": "flight", "direction" : "out", 
            "joinFieldName": "flightFromLocation",
            "lookup":"locationID", "unresolvedLinkAction":"CREATE"}

            { "class": "flight", "direction" : "in", 
            "joinFieldName": "flightToLocation",
            "lookup":"locationID", "unresolvedLinkAction":"CREATE"}
    }
  ],
   "loader" : {
    "orientdb": {
      "dbURL": "plocal:C:\orientdb-community-2.1.11\databases\Test",
      dbUser: "admin",
      dbPassword: "admin",
      dbAutoDropIfExists: false,
      dbAutoCreate: true,
      tx: false,
      wal: false,
      batchCommit: 1000,
      dbType: "graph",
      indexes: [{class:"flight", fields:["id:string"], type:"UNIQUE_HASH_INDEX" }]
    }
  }
}

在 OrientDB 的 GoogleGroups 中的一个线程中,我从 OrientDB 找到了一个 post from Luca,它说可以通过 ETL 仅加载边缘,但我仍然不知道如何实现它 :( 唯一的想法经过两天阅读文档和谷歌搜索是将它们作为顶点导入,然后编写一些控制台 JS 函数,该函数将创建具有相同属性的正确边缘......

或者我错过了一些非常基本的东西?我对东方完全陌生...

【问题讨论】:

    标签: import etl rdbms orientdb graphdb


    【解决方案1】:

    一个简单的方法来做你需要做的就是将你的两个表都导入到具有正常 ETL 过程的两个顶点类中,然后使用 js 函数创建边。

    我制作这个数据集是为了在导入两个表后重新创建您的情况:

    这里是JS函数:

    参数:flights_V_class、edge_class、location_class

    var g=orient.getGraphNoTx();
    
    
    var flightsV_table = g.command("sql","select from " + flights_V_class);
    
    for(i=0; i < flightsV_table.length; i++){
      
      var id_from = flightsV_table[i].getProperty("locationFrom");
    
      var id_to = flightsV_table[i].getProperty("locationTo");
      
      var select_from = "select from "+location_class+" where id = "+id_from;
      var select_to = "select from "+location_class+" where id = "+id_to;
      
      g.command("sql","create edge " + edge_class + " from (" + select_from + ") to (" + select_to + ")");
    }
    

    执行函数后,这里是我的数据:

    那么,毕竟你可以删除临时flights_V类。

    希望对您有所帮助。 再见。

    伊万

    【讨论】:

    • Ivan 和@Alessandro,非常感谢您的建议,我也想过 JS,但仍然希望(基于 Luka 的帖子)通过 ETL 实现。但我意识到(在发布问题后)我实际上需要一个用于同步的工具,而不仅仅是用于导入;所以现在我写了一个基于 Java API 的。希望将来link 将更加可定制:)
    【解决方案2】:

    我已经尝试过使用 MySQL

    我已经创建了位置和航班

    位置.json

    {
      "config": {
        log : "debug"
      },
      "extractor" : {
        "jdbc": { "driver": "com.mysql.jdbc.Driver",
                  "url": "jdbc:mysql://localhost:3306/flights",
                  "userName": "user",
                  "userPassword": "password",
                  "query": "select * from Location" 
                  }
      },
      "transformers" : [
        { "vertex": { "class": "Location"} }
      ],
       "loader" : {
        "orientdb": {
          "dbURL": "yourPath",
          "dbUser": "admin",
          "dbPassword": "admin",
          "dbAutoDropIfExists": false,
          "dbAutoCreate": true,
          "tx": false,
          "wal": false,
          "batchCommit": 1000,
          "dbType": "graph",
          "indexes": [{class:"Location", fields:["id:string"], type:"UNIQUE_HASH_INDEX" }]
        }
      }
    }
    

    Flight.json

    {
      "config": {
        log : "debug"
      },
      "extractor" : {
        "jdbc": { "driver": "com.mysql.jdbc.Driver",
                  "url": "jdbc:mysql://localhost:3306/flights",
                  "userName": "user",
                  "userPassword": "password",
                  "query": "select * from flight" 
                  }
      },
      "transformers" : [
        { "vertex": { "class": "Fligth"} }
      ],
       "loader" : {
        "orientdb": {
          "dbURL": "yourPath",
          "dbUser": "admin",
          "dbPassword": "admin",
          "dbAutoDropIfExists": false,
          "dbAutoCreate": true,
          "tx": false,
          "wal": false,
          "batchCommit": 1000,
          "dbType": "graph",
          "indexes": [{class:"flight", fields:["id:string"], type:"UNIQUE_HASH_INDEX" }]
        }
      }
    }
    

    etl进程导入了以下记录

    你可以使用这个 JavaScript 函数

    var g=orient.getGraphNoTx();
    g.command("sql","CREATE CLASS Fligth2 EXTENDS E");
    var fligth = g.command("sql","select from Fligth");
    for(i=0;i<fligth.length;i++){
        var idFrom=fligth[i].getProperty("idFrom");
        var idTo=fligth[i].getProperty("idTo");
        var name=fligth[i].getProperty("name");
        print(name);
        var from=g.command("sql","select from Location where id = " +  idFrom);
        var to=g.command("sql","select from Location where id = " +  idTo);
        g.command("sql","create edge Fligth2 from " + from[0].getId() + " to " + to[0].getId() + " set name = '" + name + "'");
    }
    g.command("sql","drop class Fligth unsafe");
    g.command("sql","UPDATE Location REMOVE id");
    

    你应该有这个结构

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多