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

问题描述 投票:0回答:1

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

java neo4j neo4j-cql
1个回答
1
投票

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

  1. MERGEEmployer只需要做一次,所以它应该在UNWIND之前。否则,它将为每个Employee完成。
  2. 您应该在parameters中传递雇主姓名(或ID)和雇员姓名(或ID)列表。在以下示例中,Cypher代码将参数称为$employerName$names
  3. 此外,由于2个WITH条款之间的MERGE条款只是向前传递所有标识符,因此不需要。 (但是,Cypher语法确实需要在WITHMERGE之间使用UNWIND子句)。

查询:

MERGE (employer:Employer {name: $employerName})
WITH employer
UNWIND $names AS name
MERGE (employee:Employee {name: name})
MERGE (employer)-[:Employs]->(employee)
RETURN *
© www.soinside.com 2019 - 2024. All rights reserved.