如何使用 ETL 从 CSV 导入边到 OrientDB 图中?

How to import Edges from CSV with ETL into OrientDB graph?

我正在尝试将 CSV 文件中的边导入到 OrientDB 中。顶点存储在一个单独的文件中,并已通过 ETL 导入到 OrientDB 中。 所以我的情况类似于OrientDB import edges only using ETL tool and .


更新

Friend.csv

"id","client_id","first_name","last_name"
"0","0","John-0","Doe"
"1","1","John-1","Doe"
"2","2","John-2","Doe"
...

Friend-Importer 删除了 "id" 字段,但存储了 "client_id"。这个想法是让一个已知的客户端生成 id 用于搜索等

PeindingFriendship.csv

"friendship_id","client_id","from","to"
"0","0-1","1","0"
"2","0-15","15","0"
"3","0-16","16","0"
...

"friendship_id""client_id" 应作为 "PendingFriendship" 边的属性导入。 "from" 是朋友的 "client_id""to" 是另一个朋友的 "client_id"。 因为 "client_id"FriendPendingFriendship 上都存在唯一索引。


我的 ETL 配置如下所示

...
"extractor": {
  "csv": {
  }
},
"transformers": [
  {
    "command": {
      "command": "CREATE EDGE PendingFriendship FROM (SELECT FROM Friend WHERE client_id = '${input.from}') TO (SELECT FROM Friend WHERE client_id = '${input.to}') SET client_id = '${input.client_id}'",
      "output": "edge"
    }
  },
  {
    "field": {
      "fieldName": "from",
      "expression": "remove"
    }
  },
  {
    "field": {
      "fieldName": "to",
      "operation": "remove"
    }
  },
  {
    "field": {
      "fieldName": "friendship_id",
      "expression": "remove"
    }
  },
  {
    "field": {
      "fieldName": "client_id",
      "operation": "remove"
    }
  },
  {
    "field": {
      "fieldName": "@class",
      "value": "PendingFriendship"
    }
  }
],
... 

此配置的问题在于它创建了两个边缘条目。一个是预期的 "PendingFriendship" 边缘。第二个是空的 "PendingFriendship" 边,我删除的所有字段都是具有空值的属性。 导入在第二个 row/document 处失败,因为无法插入另一个空的 "PendingFriendship",因为它违反了唯一性约束。 如何避免创建不必要的空"PendingFriendship"。 将边导入 OrientDB 的最佳方式是什么?文档中的所有示例都使用 CSV 文件,其中顶点和边在一个文件中,但我不是这种情况。

我也查看了 Edge-Transformer,但它 returns 是顶点而不是边!

Created PendingFriendships

一段时间后,我找到了将上述数据导入 OrientDB 的方法(解决方法)。而不是使用 ETL Tool I wrote simple ruby scripts which call the HTTP API of OrientDB using the Batch 端点。

步骤:

  1. 导入好友。
  2. 使用响应创建 client_ids@rids 的映射。
  3. 解析 PeindingFriendship.csv 并构建 batch 请求。
  4. 每个友谊都是由自己的命令创建的。
  5. 来自 2. 的映射用于将 @rids 插入来自 4.
  6. 的命令中
  7. 发送 1000 个命令的 batch 个请求。

批处理请求正文示例:

{
  "transaction" : true,
  "operations" : [
    {
      "type" : "cmd",
      "language" : "sql",
      "command" : "create edge PendingFriendship from #27:178 to #27:179 set client_id='4711'"
    }
  ]
}

这不是我提出的问题的答案,但它解决了将数据导入 OrientDB 的更高目标,对我来说。因此,我让社区将此问题标记为已解决或未解决。