如何使用Neo4jTemplate合并而不是创建

时间:2015-08-13 19:20:20

标签: spring-data-neo4j spring-data-neo4j-4

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

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

          
  1. 创建两个节点
  2.       
  3. 建立他们的关系
  4.       
  5. 向节点添加relashionship
  6.       
  7. 使用Neo4jTemplate.save()
  8. 保留它     

    我需要更改为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参数中的多个节点只是在调用时迭代整个事物。我还没有找到任何具有参数的示例,您可以在其中指定您所指的特定节点。如何创建参考某个节点的参数?提前谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

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