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": [
       ]
    }
  }
}

Это создало все ребра, даже если было более одного ребра, указывающего на пользователя.
Надеюсь, это поможет кому-то

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