使用Spring Data Neo4j - 创建一个与现有节点有关系的新节点

5
我需要创建一个新的A类节点,与用户节点有关联:
@NodeEntity
public class A implements Serializable {

    /**
     * Graph node identifier
     */
    @GraphId
    private Long nodeId;

    /**
     * Enity identifier
     */
    private String id;

    //... more properties ...

    @Relationship(type = "HAS_ADVERTISER", direction = Relationship.OUTGOING)
    private User user;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof IdentifiableEntity)) return false;

        IdentifiableEntity entity = (IdentifiableEntity) o;
        if (!super.equals(o)) return false;

        if (id != null) {
            if (!id.equals(entity.id)) return false;
        } else {
            if (entity.id != null) return false;
        }

        return true;
    }


}


@NodeEntity
public class User implements Serializable {

    /**
     * Graph node identifier
     */
    @GraphId
    private Long nodeId;

    /**
     * Enity identifier
     */
    private String id;

    //... more properties ...


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof IdentifiableEntity)) return false;

        IdentifiableEntity entity = (IdentifiableEntity) o;
        if (!super.equals(o)) return false;

        if (id != null) {
            if (!id.equals(entity.id)) return false;
        } else {
            if (entity.id != null) return false;
        }

        return true;
    }

}

现在,假设我们有以下新节点A的数据:
{
  "id": 1,
  "nodeId": "0001-0001",
  "user": {
           "id": 4,
           "nodeId": "0002-0002",
           "name": null,
           "firstName": null
          }
}

我正在尝试创建一个名为A的节点,并在新节点A与已存在的用户节点之间建立关系。该用户具有"id":4和"nodeId":"0002-0002"(唯一节点标识符),但是代替此操作,用户节点会将字段"name"和"firstName"更新为null
我使用GraphRepository代理来创建它:
@Repository
public interface ARepository extends GraphRepository<A> {


}

有没有不需要更新的方法,只通过与用户节点建立关系来实现呢?
2个回答

2
你可以使用 MERGE 来实现。请参阅 Cypher RefCard
@Repository
public interface ARepository extends GraphRepository<A> {

    @Query("MERGE (a:A {id:aId}})-[:HAS_ADVERTISER]-(u:User {id:{userId}})" +
           "RETURN a")
    public A createAndGetAd(@Param("aId") String aId,
                            @Param("userId") String userId)
    }

2
不,你必须通过id重新加载实体来填充所有缺失的值,然后保存,或编写自定义查询。

谢谢您的回复! - Xavi Torrens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接