如何将包含ETL的CSV中的边缘导入OrientDB图形?

时间:2017-07-27 09:03:56

标签: orientdb orientdb2.2 orientdb-etl

我正在尝试将CS​​V文件中的边缘导入OrientDB。顶点存储在单独的文件中,并已通过ETL导入OrientDB。 所以我的情况类似于OrientDB import edges only using ETL toolOrientDB ETL loading CSV with vertices in one file and edges in another

更新

Friend.csv

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

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

我还查看了Edge-Transformer,但它返回的是顶点而不是边缘!

Created PendingFriendships

1 个答案:

答案 0 :(得分:0)

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

步骤:

  1. 导入好友。
  2. 使用回复创建client_ids@rids的映射。
  3. 解析PeindingFriendship.csv并构建batch个请求。
  4. 每个友谊都是由自己的命令创建的。
  5. 来自2.的映射用于将@rids插入到4中的命令中。
  6. 在1000个命令的junks中发送batch个请求。
  7. 批处理请求正文实例:

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

    这不是我问的问题的答案,但它解决了将数据导入OrientDB的更高目标。因此,我让社区公开将这个问题标记为已解决。