Как наиболее эффективно создать отношения "один ко многим" в графе 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. Тем не менее, он имеет несколько улучшений.
MERGE
дляEmployer
нужно сделать только один раз, так что это должно быть доUNWIND
, В противном случае это будет сделано для каждогоEmployee
,- Вы должны передать имя работодателя (или идентификатор) и список имен сотрудников (или идентификаторы) в параметрах. В следующем примере код Cypher ссылается на параметры как
$employerName
а также$names
, - Кроме того, так как
WITH
пункт между 2MERGE
пункты просто передавали все идентификаторы вперед, это не нужно. (Однако синтаксис 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 *