【问题标题】:Neo4J : Proper way to delete relationship?Neo4J:删除关系的正确方法?
【发布时间】:2019-01-09 11:16:09
【问题描述】:

这是我的节点:

@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 上尝试了解决方案,它有效。这意味着如果我想删除关系,我必须删除两个实体列表中的关联:

  • 从用户模式的集合中删除模式

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

    这有点乏味...

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

谢谢

【问题讨论】:

    标签: spring-data-neo4j neo4j-ogm


    【解决方案1】:

    首先,没有必要完全解释你在两个不需要的类中的关系映射。 (个人注意:从架构的角度来看,类之间的双向依赖是我会尽量避免的。)

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

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

    【讨论】:

    • 您好,谢谢您的回答,但我不确定我是否理解您的意思:“答案是您只需要在“领先”端将其删除。这是您的用户。在您坚持用户的那一刻,关系将被删除“->我认为这正是我所做的,但这不起作用,这是我的问题:)
    • 关于模式持续存在,我没有显示整个实体,只是显示与我的问题相关的部分,但模式远不止于此(对用户也是如此)
    • 是否有可能通过User 的其他关系(忽略方向)找到Pattern?一般来说,Neo4j-OGM 从您要保存/更新的对象/节点遍历图中的所有“可达”节点。
    • 实际上用户和模式之间有很多关系:用户可以拥有该模式,可以喜欢它,可以将其添加到他的收藏夹中。我是 neo4J 的新手,但我认为我上面展示的是定义关系的经典方法,在相应实体中指定关系的两端,一个是“传入”,另一个是“输出”。这里的特殊性是,正如你所说,这是一个“ManyToMany”,因为用户可以喜欢很多模式,并且一个模式可以被很多用户喜欢,我必须能够在我的应用程序的不同部分显示这些信息跨度>
    • 在这种情况下,我建议使用(非常)有限的深度进行保存,例如0。这将导致repo.save(user, 0)。我还不确定这是否会触及关系或忽略它。但是在我找到时间之前试一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多