OrientDB ETL: как пропустить дублирующую вершину, но создать ребро
Я создаю коммуникационный граф.
У каждого сообщения есть сообщение, и у каждого человека есть идентификатор пользователя.
Я уже создал вершины сообщения, теперь я хочу создать пользовательские вершины и ребро, соединяющее вершину сообщения с пользовательской вершиной.
Пользователь может получить несколько сообщений (очевидно).
Мой файл содержит:
msgid, userid, (и некоторую другую информацию, которую я назначу краю)
Вопрос в том, что у меня в файле есть дубликаты идентификаторов пользователей (поскольку пользователи могут получать несколько сообщений), я не хочу создавать другую вершину с идентификатором пользователя, поэтому я пропускаю дубликаты. Но если я пропущу дубликаты, то край тоже не будет создан. Я хочу, чтобы несколько ребер были в одной и той же пользовательской вершине, поскольку каждое ребро представляет одно сообщение.
Как сохранить уникальную вершину пользователя, но создать ребро?
Мой текущий файл ETL .json, который отлично работает, за исключением того, что я подробно описал выше.
{
"source": { "file": { "path": "msgs.txt" } },
"extractor": { "row": {} },
"transformers": [
{ "csv": {"separator": "\t"} },
{ "vertex": { "class": "user", "skipDuplicates": true } },
{ "edge": { "class": "sent_to", "joinFieldName": "msgid", "lookup":"message.id","direction": "in" } },
"edgeFields": { "n": "${input.n}" }
],
"loader": {
"orientdb": {
"dbURL": "remote:/localhost/databases/communication",
"dbType": "graph",
"classes": [
{"name": "user", "extends": "V"},
{"name": "message", "extends": "V"},
{"name": "sent_to", "extends": "E"}
], "indexes": [
{"class":"user", "fields":["id"], "type":"UNIQUE" }
]
}
}
}
1 ответ
Хорошо, вот что я сделал, и, похоже, это сработало.
Сначала я создал вершины сообщения (как указано выше, в д.).
Затем я создал пользовательские вершины.
Затем, чтобы создать ребро между ними, я запустил следующий ETL для файла с {userid, msgid, ...}
{
"source": { "file": { "path": "msgs1.txt" } },
"extractor": { "row": {} },
"transformers": [
{ "csv": {"separator": "\t"} },
{ "merge": {"joinFieldName": "userid", "lookup": "user.id"} },
{ "vertex": { "class": "user", "skipDuplicates": true } },
{ "edge": { "class": "sent_to",
"joinFieldName": "msgid",
"lookup":"message.id",
"direction": "in",
"edgeFields": { "n": "${input.n}", "date": "${input.date}"}
}
}
],
"loader": {
"orientdb": {
"dbURL": "remote:/localhost/databases/communication",
"dbType": "graph",
"classes": [
{"name": "user", "extends": "V"},
{"name": "message", "extends": "V"},
{"name": "sent_to", "extends": "E"}
],
"indexes": [
]
}
}
}
Это создало все ребра, даже если было более одного ребра, указывающего на пользователя.
Надеюсь, это поможет кому-то