Создать связь между (пока) существующими узлами

#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 .