我们可以更新 RelationshipEntity 以指向不同的 NodeEntity 吗?

Can we update a RelationshipEntity to point to a different NodeEntity?

使用 Neo4j-OGM 我正在​​尝试更新 @RelationshipEntity 以指向不同的节点对象。但是当我尝试保留更改时,它并没有被保存,它只是恢复到原来的实体。

比如我要达到的效果是这样的:

from:    (X)--[R]->(M)    (Y)

  to:    (Y)--[R]->(M)    (X)

我在 CineastsRelationshipEntityTest 集成测试中做了一个例子:

@Test
public void canUpdateRelationshipEntity() {
    Movie movie = new Movie("M", 2020);

    Actor actor = new Actor("X");
    Role relationship = actor.playedIn(movie, "R");

    Actor actor2 = new Actor("Y");
    actor2.setRoles(new HashSet<>());

    assertThat(actor.getRoles()).hasSize(1);
    assertThat(actor2.getRoles()).hasSize(0);

    session.save(actor);
    session.save(actor2);

    session.clear();


    // try to update the relationship:
    relationship.setActor(actor2);
    actor.getRoles().remove(relationship);
    actor2.getRoles().add(relationship);

    assertThat(actor.getRoles()).hasSize(0);
    assertThat(actor2.getRoles()).hasSize(1);

    session.save(actor);
    session.save(actor2);

    session.clear();



    Actor loadedActor = session.load(Actor.class, actor.getUuid());
    Actor loadedActor2 = session.load(Actor.class, actor2.getUuid());

    assertThat(loadedActor.getRoles()).hasSize(0);
    assertThat(loadedActor2.getRoles()).hasSize(1);
}

最后,loadedActorloadedActor2没有反映更新后的关系。

您可以专注于将属性保留在 Role 实例中来执行此操作。 但是当您尝试更新时,您必须重置 id。 关系不是你可以重复使用的,而是必须重新创建的。

Neo4j-OGM 假设给定的 id 只有属性发生了变化,而不是开始或结束节点。

关于您的测试用例的一些评论:

  • 如果您调用 session.clear()(在第一次保存之后),您必须在操作模型之前重新加载演员以使 Neo4j-OGM 了解更改。
  • 只保存actor就够了。保存级联到所有可到达的节点和关系。即使在删除的情况下,如果您尊重第一条评论,这也应该有效 ;)