Как наиболее эффективно создать отношения "один ко многим" в графе neo4j?

В настоящее время я новичок в neo4j и изучаю с шифром запросов для задачи под рукой. Я использую болт-драйвер neo4j в Java. Вот что я пытаюсь достичь. У меня есть что-то вроде данных ниже, доступных как Java ArrayList(хранится в HashMap):

EmployerId 2: [employeeId 1, employeeId 2, employeeId3, ...]

Что в основном показывает отношения между работодателем и работником (это работники работодателя 2)

Теперь мне нужно найти этих сотрудников и работодателей на графике (они могут уже существовать или не существовать) и создать между ними отношения "(x:Employer) -[Employs]->(y:Employee)".

Один из способов (возможно, наивный), о котором я могу подумать, - это каждый раз искать работодателя и работника и запускать отдельный запрос CREATE для каждого.

match (employer:Employer{name:"John"}), (name:Employee{name:"Snow"}) CREATE (employer)-[pr:EMPLOYES]->(employee)

Но я чувствую, что будет ненужный поиск одного и того же узла работодателя несколько раз. И так как время является важным критерием для меня сейчас, я ищу лучший путь (если существует)

Как новичок в neo4j, все, что я могу придумать, - это выполнить поиск идентификатора работодателя один раз, а затем выполнить несколько запросов с использованием этого результата, причем каждый раз выполняется поиск идентификатора сотрудника. Но я не могу найти правильный запрос для этого. Кроме того, это будет правильный подход? Мне нужно подготовить этот запрос из Java. Так я должен сделать запрос несколько раз или отправить один запрос?

1 ответ

Решение

Этот запрос ниже похож на запрос от @Lju. Тем не менее, он имеет несколько улучшений.

  1. MERGE для Employer нужно сделать только один раз, так что это должно быть до UNWIND, В противном случае это будет сделано для каждого Employee,
  2. Вы должны передать имя работодателя (или идентификатор) и список имен сотрудников (или идентификаторы) в параметрах. В следующем примере код Cypher ссылается на параметры как$employerName а также $names,
  3. Кроме того, так как WITH пункт между 2 MERGE пункты просто передавали все идентификаторы вперед, это не нужно. (Однако синтаксис Cypher требует WITH пункт между MERGE и UNWIND).

Запрос:

MERGE (employer:Employer {name: $employerName})
WITH employer
UNWIND $names AS name
MERGE (employee:Employee {name: name})
MERGE (employer)-[:Employs]->(employee)
RETURN *
Другие вопросы по тегам