2016-02-29 5 views
0

с помощью Community Edition 2.1.11Импорт из РСУБД в OrientDB:. Края нагрузки только

Я видел несколько подобных вопросов в Интернете (еи import edges to OrientDB using etl или orient-database.narkive.com/d8c4b82y/orientdb- etl-edge-creation-help), но пока они еще не решены.

Я реализую систему поиска полетного соединения. У меня есть СУБД (SQL Server) с двумя связанными таблицами - Местоположениями и Полетами. Каждый рейс несет два идентификатора местоположения - locationFrom и locationTo.

Когда я импортирую его на график, я хочу видеть местоположения как вершины, связанные с полетами как кромки. Как я понял из руководства (Import-from-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" }] 
    } 
    } 
} 

В одном из потоков в GoogleGroups OrientDB, я нашел post from Luca от OrientDB, который говорит, что нагрузка только края можно через ETL, но я до сих пор не могу понять, как его достичь: (единственная идея, которую я имею после двух дней чтения документов и поиска в Google, - это импортировать их как вершины, а затем написать некоторую консольную функцию JS, которая создаст правильные ребра с теми же свойствами. .

Или, может быть, я что-то очень простой? Я совершенно новой для Востока не хватает ...

ответ

1

в простой способ сделать то, что вам нужно, - это импортировать обе таблицы в два класса вершин с нормальным процессом ETL, а затем создать ребра, используя функцию js.

Я сделал этот набор данных, чтобы воссоздать ситуацию после импорта обеих таблиц:

locations flights_V

Вот функция 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 + ")"); 
} 

После выполнения функции здесь мои данные: locations_EE flights_E

Затем, в конце концов, вы можете удалить временный класс flights_V.

Надеюсь, это поможет. До свидания.

Иван

+0

Ivan and @Alessandro, большое спасибо за ваши предложения, я тоже думал о JS, но все же хотел (на основе поста Luka) сделать это через ETL. Но я понял (после размещения вопроса), что мне действительно нужен инструмент для синхронизации, а не только для импорта; поэтому на данный момент я пишу один на основе Java API. Надеюсь, что в будущем [link] (https://github.com/orientechnologies/orientdb-labs/blob/master/Teleporter-Index.md) будет более настраиваемым :) – grreeenn

0

Я попытался с MySQL

Я создал Место и Авиаперелет

enter code here

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

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 импортировала следующие записи

enter image description here

Вы можете использовать эту функцию 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"); 

И вы должны иметь такую ​​структуру

enter image description here

enter image description here