#neo4j
#neo4j
Вопрос:
Я пытаюсь передать данные из Kafka в Neo4j через neo4j-stream
плагин. В настоящее время мы экспериментируем со CUD
стратегией.
Интересно, как мы должны обращаться со взаимосвязанными данными. Давайте предположим, что мы отправляем 100 человек из Kafka в Neo4j. Когда person(id:1)
есть связь is_friends_with
с person(id:50)
, мы не можем создать эту связь, пока не будет создан узел для person(id:50)
.
Однако мы не можем контролировать порядок поступления событий из Kafka.
Поэтому, когда поступают данные о персонаже, мы бы создали следующие данные CUD:
- создать узел для
person(id:1)
- создать связь
is_friends_with(person1, person50)
. - …
- создать узел для
person(id:50)
Неудивительно, что когда мы принимаем события в таком порядке, связь отсутствует.
Как мы можем с этим справиться?
Ответ №1:
Я думаю, что это типичный случай использования слияния.
Каждый раз, когда у вас есть связь (которая имеет начальный и конечный узлы), вы делаете
MERGE (n:Person {id:foo})
MERGE (m:Person {id:bar})
MERGE (n)-[:is_friends_with]-(m)
Слияние для связи НЕ имеет направления, чтобы избежать двунаправленных шаблонов в случае, если n и m поступают в разном порядке.
Комментарии:
1. Вопрос в том, что происходит, когда
MERGE (n)-[:is_friends_with]-(m)
приходит раньшеMERGE (m:Person {id:bar})
? Это сценарий, с которым мы сталкиваемся, потому что у нас нет контроля над порядком событий.2. Это реалистичный сценарий? Я имею в виду, что отношения не могут существовать без людей в начале и в конце. Другими словами, связь всегда включает данные, которые определяют начальный и конечный узлы. Вы должны быть в состоянии извлечь это, чтобы сначала ОБЪЕДИНИТЬ их, чтобы вы могли быть уверены, что они существуют, прежде чем ОБЪЕДИНЯТЬ отношения.
3. Когда мы получаем данные через
neo4j-streams
, это обычный сценарий. Пустая база данных должна быть заполнена событиями из темы Kafka. И этоstream
, это означает, что у него нет определенного конца. Таким образом, мы не можем сказать: сначала импортируйтеnodes
, а затемrelationships
.