OrientDB:使用subselect创建边

时间:2015-08-27 02:46:50

标签: orientdb

我在MySQL表(id,parentId)中有一个简单的树结构,有大约300万个顶点,并希望将其导入到OrientDB Graph数据库中。 ETL导入器平滑地导入顶点,但不能创建边(NullPointerException)。 ETL甚至不使用文档中给定示例的普通数据库(http://orientdb.com/docs/last/Import-a-tree-structure.html抛出相同的异常),所以我只是导入顶点并想手动创建边。

我有一个带有两个属性(id,parentId)的顶点类(地址),我想在这些顶点之间创建边(parentId - > id)。有没有一种简单的方法来实现这一点,而不是将边缘插入循环中?像SQL

中的东西
INSERT INTO E (out, in) VALUES (SELECT parentId, id FROM Address)

由于只能使用CREATE EDGE创建边缘,我想OrientDB默认情况下不支持这样的操作。但也许有一种解决方法可以创建这300万个边缘?

我发现在两条记录之间建立链接很容易:

CREATE LINK parentLink TYPE LINK FROM Address.parentId TO Address.Id

但是,我无法以这种方式创建边缘。我尝试使用变量

CREATE EDGE isParentOf FROM (SELECT FROM Address) TO (SELECT FROM Address WHERE id = $current.parentId)

但这不起作用。

1 个答案:

答案 0 :(得分:-1)

你有没有试过这个ETL Json:

{
  "config": {"log": "debug", "parallel": true },    
  "extractor" : {
    "jdbc": { "driver": "oracle.jdbc.driver.OracleDriver",
              "url": "jdbc:oracle:thin:hostname/db",    
              "userName": "username",    
              "userPassword": "password",    
              "query": "select id, A.parentId from Address a where rownum<2"     }    
  },    
  "transformers": [`enter code here`

    { "vertex": { "class": "Address" }},

    { "edge": { "class": "isParentOf",
      "joinFieldName": "parentId",
      "lookup": "Address.Id",
      "direction": "in",
      "skipDuplicates":true
    }
    }
    ],
    "loader": {
    "orientdb": {
      "dbURL": "remote:server/db",
      "dbUser": "user",
      "dbPassword": "passwd!",
      "dbType": "graph",
      "classes": [
        {"name": "Address", "extends": "V"},
        {"name": "isParentOf", "extends": "E"}
      ], "indexes": [
        {"class":"Address", "fields":["ID:string"], "type":"UNIQUE" }
      ]
    }
  }
}