我目前正在迭代一个数组,其中每个索引包含两个节点和一个关系(Part_1 - > Part_2),并且我使用Neo4jTemplate.save()方法将其持久化到数据库中。但是,某些索引具有与其他节点具有关系的重复节点(Part_2 - > Part_3)。我的版本目前每次创建一个新的节点和关系,而不是在节点已经存在的情况下合并。
我读了这个post,但我不明白如何实现它,以便两个相同的节点具有相同的ID。我目前的代码是这样的:
我需要更改为MERGE而不是CREATE?在我坚持之前是否需要进行检查,或者在持续使用SDN 4时是否有办法检查?
编辑:
我决定使用Neo4jTemplate.query()方法编写Cyper查询,但我不知道如何正确创建参数以合并多个节点。我可以为一个节点正确创建一个MERGE语句:
Map< String,Object> params = new HashMap< String,Object>();
Map< String,Object> node = new HashMap< String,Object>();node.put("名称"," Part_1");
params.put("道具",node_1);
字符串查询=" MERGE(n1:Part {name:{props} .name})&#34 ;;template.query(query,params);
我的目标是在两个节点上调用merge,然后再次调用merge以在一个语句中创建关系。我的代码现在看起来像这样:
Map< String,Object> params = new HashMap< String,Object>();
列表< 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");
maps = Arrays.asList(node_1,node_2)params.put("道具",地图);
字符串查询=" MERGE(n1:Part {name:{props} .name1})
MERGE(n2:Part {name:{props} .name2)
MERGE(N1) - [:CREATED] - GT;(N 2)&#34 ;;template.query(query,params);
到目前为止我所见的所有examples参数中的多个节点只是在调用时迭代整个事物。我还没有找到任何具有参数的示例,您可以在其中指定您所指的特定节点。如何创建参考某个节点的参数?提前谢谢!
答案 0 :(得分:3)
很难在不看到您的代码的情况下建议要更改的内容,但听起来就像您每次都要保存新的实体实例一样。
传递给Neo4jTemplate.save(entity)
的实体一旦被写入数据库,就应该使用ID进行更新。 SDN将尝试更新已拥有ID的节点,因此我建议重新使用实体实例而不是创建新实例。
如果您不想自己管理这些实体,可以尝试在步骤1中加载实体,然后仅在它们不存在的情况下创建它们。