如何以最有效的方式在neo4j图中创建一对多关系?

时间:2017-12-21 12:38:20

标签: java neo4j neo4j-cql

我目前刚接触neo4j并使用cypher查询来完成手头的任务。我在Java中使用neo4j bolt驱动程序 这是我想要实现的目标。我有类似下面的数据作为Java ArrayList(存储在HashMap中):

雇主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准备这个查询。我应该多次查询还是发送一个查询?

1 个答案:

答案 0 :(得分:1)

下面的查询类似于@Lju中的查询。但是,它有一些改进。

  1. MERGE的{​​{1}}只需要执行一次,因此它应该在Employer之前。否则,将为每个UNWIND完成。
  2. 您应该传递雇主姓名(或ID)和雇员名单 中的名字(或ids) parameters。在 以下示例中,Cypher代码将参数指定为 Employee$employerName
  3. 此外,由于2 $names子句之间的WITH子句只是向前传递所有标识符,因此不需要。 (但是,Cypher语法确实需要MERGEWITH之间的MERGE子句。
  4. 查询:

    UNWIND