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

标签 java neo4j neo4j-cql

我目前是 Neo4j 的新手,正在探索手头任务的密码查询。我在 Java 中使用 neo4j bolt 驱动程序 这就是我想要实现的目标。我有类似以下数据的 Java ArrayList(存储在 HashMap 中):

雇主 ID 2:[雇员 ID 1、雇员 ID 2、雇员 ID3、...]

这基本上显示了雇主和雇员之间的关系(这些是雇主 2 的雇员)

现在,我需要在图中找到这些员工和雇主(他们可能已经存在,也可能不存在)并创建一个 "(x:Employer) -[Employs]->(y:Employee)"它们之间的关系。

我能想到的一种方法(也许很天真)是每次搜索雇主和雇员,并为每个方法运行单独的 CREATE 查询。

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

但我觉得没有必要多次搜索同一个雇主节点。由于时间现在对我来说是一个重要的标准,我正在寻找更好的方法(如果存在)

作为 neo4j 的新手,我能想到的就是搜索一次雇主 ID,然后使用该结果运行多个查询,每次都搜索员工 ID。但我无法找到正确的查询来执行此操作。此外,这是正确的方法吗?我需要从 Java 准备这个查询。那么我应该多次查询还是发送单个查询?

最佳答案

下面的这个查询看起来与 @Lju 的查询类似。不过,它有一些改进。

  1. EmployerMERGE 只需要执行一次,因此它应该出现在 UNWIND 之前。否则,将为每个员工完成此操作。
  2. 您应该传递雇主姓名(或 ID)和雇员名单 中的名称(或 ID) parameters 。在 以下示例中,Cypher 代码将参数引用为 $employerName$names
  3. 此外,由于 2 个 MERGE 子句之间的 WITH 子句只是向前传递所有标识符,因此不需要它。 (但是,Cypher 语法确实需要在 MERGEUNWIND 之间有一个 WITH 子句)。

查询:

MERGE (employer:Employer {name: $employerName})
WITH employer
UNWIND $names AS name
MERGE (employee:Employee {name: name})
MERGE (employer)-[:Employs]->(employee)
RETURN *

关于java - 如何以最有效的方式在neo4j图中创建一对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47925187/

相关文章:

java - 通过 Android 连接到 Neo4j - 不可能完成的任务?

Neo4j 密码 : check attributes of not consecutive nodes in path

java - 如何在 neo4j 中不保留逻辑日志?

Neo4j - 根据标签获取电影推荐

java - 为什么这个 lambda 函数在错误的类加载器中启动类加载?

java - 如何在按下按钮之前激活按钮?

java - 无法全部替换为美元符号

java - Long.parseLong 给出 NumberFormatException