1

我目前正在迭代一个数组,其中每个索引包含两个节点和一个关系(Part_1 -> Part_2),并且我正在使用 Neo4jTemplate.save() 方法将其保存到数据库中。但是,某些索引具有重复的节点,这些节点将与其他节点有关系(Part_2 -> Part_3)。我的版本目前每次都会创建一个新节点和关系,而不是在节点已经存在时合并。

我读了这篇文章,但我不明白如何实现它,以便两个相同的节点具有相同的 ID。我当前的代码是这样工作的:

  1. 创建两个节点
  2. 建立他们的关系
  3. 向节点添加 relashionship
  4. 使用 Neo4jTemplate.save() 持久化它

我需要将什么更改为 MERGE 而不是 CREATE?我是否需要在坚持之前进行检查,或者是否有办法在坚持 SDN 4 时进行检查?

编辑:

我决定使用 Neo4jTemplate.query() 方法来编写 Cyper 查询,但是我不知道如何正确创建参数以合并多个节点。我可以像这样为一个节点正确创建一个 MERGE 语句:

Map<String, Object> 参数 = new HashMap<String, Object>();
Map<String, Object> 节点 = new HashMap<String, Object>();

node.put("name", "Part_1");
params.put("道具", node_1);
字符串查询 = "MERGE(n1:Part {name:{props}.name})";

模板.查询(查询,参数);

我的目标是在两个节点上调用合并,然后再次调用合并以在一个语句中创建关系。我的代码现在看起来像这样:

Map<String, Object> 参数 = new HashMap<String, Object>();
List<Map<String, Object>> 地图;
Map<String, Object> node1 = new HashMap<String, Object>();
Map<String, Object> node2 = new HashMap<String, Object>();

node1.put("name1", "Part_1");
node2.put("name2", "Part_2");
地图 = Arrays.asList(node_1, node_2)

params.put("道具", 地图);
字符串查询=“合并(n1:Part {name:{props}.name1})
MERGE(n2:Part {name:{props}.name2)
MERGE(n1)-[:CREATED]->(n2)”;

模板.查询(查询,参数);

到目前为止,我在参数中看到的所有示例都带有多个节点,只是在调用时迭代整个事物。我还没有找到任何具有参数的示例,您可以在其中指定您所指的某个节点。如何创建引用某个节点的参数?提前致谢!

4

1 回答 1

3

在没有看到代码的情况下很难建议要更改的内容,但听起来您每次都在保存新的实体实例。

将传递给的实体Neo4jTemplate.save(entity)写入数据库后,应使用 ID 对其进行更新。SDN 将尝试更新已经具有 ID 的节点,因此我建议重新使用实体实例而不是创建新实例。

如果您不想自己管理这些实体,您可以尝试在步骤 1 中加载实体,然后仅在它们不存在时才创建它们。

于 2015-08-13T19:38:15.860 回答