我目前是neo4j的新手,并使用cypher查询来完成手头的任务。我在Java中使用neo4j bolt驱动程序这是我想要实现的。我有类似下面的数据作为Java ArrayList(存储在HashMap中):
employerId 2:[employeeId 1,employeeId 2,employeeId3,...]
这基本上显示了雇主和雇员之间的关系(这些是雇主2的雇员)
现在,我需要在图表中找到这些员工和雇主(他们可能已经存在或者可能不存在)并创建“(x:雇主) - [雇佣] - >(y:员工)”他们之间的关系。
我能想到的一种方式(可能是天真的)是每次都搜索雇主和雇员,并为每个人运行一个单独的CREATE查询。
match (employer:Employer{name:"John"}), (name:Employee{name:"Snow"}) CREATE (employer)-[pr:EMPLOYES]->(employee)
但我觉得不必多次搜索同一个Employer节点。由于时间对我来说是一个重要的标准,我正在寻找更好的方法(如果存在)
作为neo4j的新手,我能想到的是,一次搜索雇主ID,然后使用该结果运行多个查询,每次都搜索员工ID。但我无法找到正确的查询来执行此操作。此外,这是正确的方法吗?我需要从Java准备这个查询。我应该多次查询还是发送一个查询?
下面的查询类似于@Lju中的查询。但是,它有一些改进。
MERGE
的Employer
只需要做一次,所以它应该在UNWIND
之前。否则,它将为每个Employee
完成。$employerName
和$names
。WITH
条款之间的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 *