1

我正在尝试将 CSV 文件中的边导入 OrientDB。顶点存储在一个单独的文件中,并且已经通过 ETL 导入 OrientDB。所以我的情况类似于仅使用 ETL 工具和OrientDB ETL 加载 CSV 的OrientDB 导入边,其中顶点在一个文件中,边在另一个文件中


更新

朋友.csv

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

"id"字段被 Friend-Importer 删除,但"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”边缘,我删除的所有字段都作为具有空值的属性。导入在第二行/文档处失败,因为无法插入另一个空的“PendingFriendship”,因为它违反了唯一性约束。如何避免创建不必要的空“PendingFriendship”。将边缘导入 OrientDB 的最佳方法是什么?文档中的所有示例都使用 CSV 文件,其中顶点和边在一个文件中,但对我而言并非如此。

我还查看了Edge-Transformer,但它返回的是 Vertex 而不是 Edge!

已创建待处理的友谊

4

1 回答 1

0

一段时间后,我找到了一种将上述数据导入 OrientDB 的方法(解决方法)。我没有使用ETL 工具,而是编写了简单的 ruby​​ 脚本,这些脚本使用Batch端点调用 OrientDB 的 HTTP API。

脚步:

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

批处理请求正文示例:

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

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

于 2017-08-02T19:44:48.793 回答