0

Community Edition 2.1.11 を使用

インターネットで同様の質問をいくつか見ました (例: etl または orient-database.narkive.com/d8c4b82y/orientdb-etl-edge-creation-help を使用して Edge を OrientDB にインポートする) が、実際にはまだ解決されていません。

フライト接続検索システムを実装しています。Locations と Flights という 2 つの関連テーブルを持つ RDBMS (SQL Server) があります。各フライトには、locationFrom と locationTo の 2 つの locationID があります。

それをグラフにインポートするとき、位置を頂点として、フライトに接続されたエッジとして表示したいと考えています。マニュアルから理解したように (Import-from-DBMS、初心者の制限により 2 つ以上のリンクを投稿することはできません...)、この目的のために 2 つの異なる 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 のスレッドの 1 つで、OrientDB のLucaからの投稿を見つけました。これは、ETL を介してエッジのみをロードすることが可能であると述べていますが、それを達成する方法はまだわかりません:( 2 日間ドキュメントを読んでグーグルで調べたのは、それらを頂点としてインポートしてから、同じプロパティで適切なエッジを作成するコンソール JS 関数を作成することです...

それとも、非常に基本的なものが欠けているのでしょうか? オリエンタル初心者です...

4

2 に答える 2

1

必要なことを行う簡単な方法は、通常の ETL プロセスで両方のテーブルを 2 つの頂点クラスにインポートし、js 関数を使用してエッジを作成することです。

両方のテーブルのインポート後に状況を再現するために、このデータセットを作成しました。

場所 フライト_V

JS 関数は次のとおりです。

パラメータ: flight_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 + ")");
}

関数を実行した後のデータは次のとおりです。 location_EE フライト_E

その後、結局のところ、一時的な flight_V クラスを削除できます。

それが役に立てば幸い。さよなら。

イヴァン

于 2016-03-01T02:01:26.343 に答える
0

私はMySQLで試しました

Location と Flight を作成しました

ここにコードを入力してください

Location.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" }]
    }
  }
}

フライト.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");

そして、あなたはこの構造を持つべきです

ここに画像の説明を入力

ここに画像の説明を入力

于 2016-03-01T14:39:22.200 に答える