Как импортировать края из CSV с ETL в график OrientDB?

Я пытаюсь импортировать края из CSV-файла в OrientDB. Вершины хранятся в отдельном файле и уже импортированы через ETL в OrientDB. Так что моя ситуация похожа на импортные ребра OrientDB только с использованием инструмента ETL и ETL OrientDB, загружающий CSV с вершинами в одном файле и ребрами в другом.


Обновить

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" Поле 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" существует уникальный индекс на обоих Friend а также PendingFriendship,


Моя конфигурация 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!

Создано PendingFriendships

1 ответ

Через некоторое время я нашел способ (обходной путь) для импорта вышеуказанных данных в OrientDB. Вместо использования инструмента ETL я написал простые скрипты ruby, которые вызывают HTTP API OrientDB с использованием конечной точки Batch.

шаги:

  1. Импортируйте друзей.
  2. Используйте ответ, чтобы создать отображение client_ids в @rids,
  3. Разобрать PeindingFriendship.csv и построить batch Запросы.
  4. Каждая Дружба создается своей собственной командой.
  5. Отображение из 2. используется для вставки @rids в команду из 4.
  6. Отправить batch запросы в старьях 1000 команд.

Пример тела запроса партии:

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

Это не ответ на вопрос, который я задал, но он решает для меня более высокую задачу импорта данных в OrientDB. Поэтому я оставляю открытым для сообщества пометить этот вопрос как решенный или нет.

Другие вопросы по тегам