Как импортировать края из 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!
1 ответ
Через некоторое время я нашел способ (обходной путь) для импорта вышеуказанных данных в OrientDB. Вместо использования инструмента ETL я написал простые скрипты ruby, которые вызывают HTTP API OrientDB с использованием конечной точки Batch.
шаги:
- Импортируйте друзей.
- Используйте ответ, чтобы создать отображение
client_ids
в@rids
, - Разобрать
PeindingFriendship.csv
и построитьbatch
Запросы. - Каждая Дружба создается своей собственной командой.
- Отображение из 2. используется для вставки
@rids
в команду из 4. - Отправить
batch
запросы в старьях 1000 команд.
Пример тела запроса партии:
{
"transaction" : true,
"operations" : [
{
"type" : "cmd",
"language" : "sql",
"command" : "create edge PendingFriendship from #27:178 to #27:179 set client_id='4711'"
}
]
}
Это не ответ на вопрос, который я задал, но он решает для меня более высокую задачу импорта данных в OrientDB. Поэтому я оставляю открытым для сообщества пометить этот вопрос как решенный или нет.