Neo4J:删除关系的正确方法?

时间:2019-01-09 11:16:10

标签: spring-data-neo4j neo4j-ogm

这是我的节点:

@NodeEntity
public class User {

    @Id
    @Index(unique = true)
    @GeneratedValue(strategy = UuidStrategy.class)
    private String id;

    @Relationship(type = "LIKE")
    private Collection<Pattern> likedPatterns;
    ...
}


@NodeEntity
public class Pattern {
    @Id
    @Index(unique = true)
    @GeneratedValue(strategy = UuidStrategy.class)
    private String id;

    private String name;

    @Relationship(type = "LIKE", direction = Relationship.INCOMING)
    private List<User> likes;
    ...
}

我尝试删除用户和模式之间的关系:

@Override
@Transactional(readOnly = false)
public void deleteLikedPattern(String patternId, Long authId) {
    User user = userRepository.findByAuthId(authId);
    user.getLikedPatterns().removeIf(p -> p.getId().equals(patternId));
    userRepository.save(user);

}

在初学者中有2种模式。在调试时,我可以看到在模式集合中找到了patternId,并且从列表中删除了相应的模式。 然后save()完成,并且我没有错误。但是,如果我签入数据库,则模式和用户仍保持链接,关系仍在这里。

我在这篇Neo4j OGM how to delete relationship上尝试了有效的解决方案。这意味着,如果要删除关系,则必须删除两个实体列表中的关联:

  • 从用户模式集合中删除模式
  • 从特征码用户的集合中删除用户)

    这有点乏味...

在许多其他询问相同问题的线程中,人们似乎不建议删除双方的关联。 我的问题是:我是否必须删除双方的关联,还是应该仅从用户的收藏夹列表中删除模式即可。

Thx

1 个答案:

答案 0 :(得分:0)

首先,不需要在不需要的两个类中都完整解释您的关系映射。 (个人说明:从体系结构的角度来看,我会尽量避免类之间的双向依赖。)

答案是,您只需要在“领先”端将其删除。这是您的User。在您坚持user的那一刻,该关系将被删除,因为Neo4j-OGM a)看到了修改,并且b)无法到达截止节点以遍历到user并在其中重新创建它同样的过程。

一些附加说明:如果以上示例将Pattern视为汇总根,则甚至不应该存在User的存储库。因此,持久保存Pattern总是需要持久保存相关的User。如我所见,这在您当前的域模型中稍微复杂一点,因为您正在使用m:n(多对多)映射。 Spring Data的想法是使您能够在DDD(域驱动程序设计)中进行思考和工作。我建议阅读这篇文章http://udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/和/或其他许多使用DDD的文章。