当前位置: 首页 > 知识库问答 >
问题:

Spring Data Neo4J-创建与现有节点具有关系的新节点

茅和玉
2023-03-14

我需要创建一个新的A类节点,它与User节点有关系:

@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

我正在使用GraphRespository代理创建它:

@Repository
public interface ARepository extends GraphRepository<A> {


}

有没有办法不进行此更新,只与用户节点建立关系?

共有2个答案

吕俊哲
2023-03-14

您可以通过合并来完成。参见Cypher参考卡

@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)
    }
李浩邈
2023-03-14

不,您必须按id重新加载实体以填充所有缺失的值,然后保存,或者编写自定义查询。

 类似资料:
  • “email”节点以前是从另一个“people.csv”文件创建的,并且“email”节点存在唯一性约束。在上面的行中,我希望通过关系将“created_by”、“delivered_to”和“delivered_by”节点与之前创建的“email”节点合并。当我运行代码时,它给出了错误,并且没有从CSV中创建any节点。如何组织密码查询以防止此错误?谢了。

  • 我当前有一个查询,用于在Men节点和People节点之间建立关系: Mem节点包含一个personid数组,我正在展开该数组,然后将其与personid节点对应。但是,查询正在与它创建的新Person节点建立关系,只使用相应的PersonId属性(而不使用其他属性),而不是与具有相应PersonId的现有Person节点建立关系。 即使我对带有Person标签的节点的personID属性有一个唯一

  • 我需要在所有具有相同属性值的节点之间创建关系。 例如,我可以使用以下查询: 但是如果我有大约200K的节点,这个脚本运行的时间相当长。 有没有其他更快的方法来建立这样的关系? 谢谢

  • 我试图在Neo4j中创建节点之间的关系。我正在使用Neo4J(2.1.8社区) 我试图创建以下关系。 创建一个新的员工(节点),它将向DB中的Manager(节点)报告(空关系)(按名称搜索)。我使用了下面的查询。 我得到了下面的错误。 谁能告诉我这个问题出了什么问题?另外,如果这不是使用GraphRespository创建关系的正确方法,那么我还可以使用什么来实现同样的目的呢。 提前感谢。 注意

  • 我正在创建一个简单的社交图,用户可以在其中创建一个帖子,标记它,并对它进行评论。我用py2neo做模型。该模型具有和作为节点。用户在上、或。在我的例子中,单个用户可以在单个上创建多个或(就像其他任何社交网络一样)。根据我的模型,这需要多个或关系,但具有不同的属性。模型是这样建立的: 我运行以下操作来构建图形: 我希望有两个关系,如下所示: 但我看到事实并非如此: 那么,我的问题是双重的。(1)可以

  • 我想使用py2neo的OGM来表示从一个节点类型到两个节点类型的关系。 这段关系的“结束”应该指向一辆车,而不是一栋房子。但显然py2neo并不关心那么多,而是像预期的那样将所有东西都存储在数据库中:一个人、一辆车和一栋房子通过拥有关系连接起来。 现在的问题是使用上面的类来检索节点和关系。当节点属性正确加载时,关系不是: 这导致: 此行为与类对象一致。 我如何在py2neo.ogm中用同一个类建模