【问题标题】:Neo4j OGM how to delete relationshipNeo4j OGM如何删除关系
【发布时间】:2016-05-25 07:01:21
【问题描述】:

我有两个以无属性关系连接的 neo4j-OGM 节点实体,如下所示:

@NodeEntity
public class User {

    @Relationship(type = RelationshipNames.USER_DEVICES, direction = Relationship.UNDIRECTED)
    private Set<Device> devices;

}

@NodeEntity
public class Device {

    @Relationship(type = RelationshipNames.USER_DEVICES, direction = Relationship.UNDIRECTED)
    private User user;

}

当我向用户添加设备然后执行保存时,我得到了这个图表:

后来,当我将设备从用户设备集中删除并保存,并将设备用户设置为空并保存时,我仍然有相同的图表,这意味着设备和用户之间的关系仍然存在。

我做错了什么?有办法删除吗?

【问题讨论】:

    标签: java neo4j spring-data-neo4j-4 neo4j-ogm


    【解决方案1】:

    如果没有看到您编写的保存这些对象的代码,就很难诊断出您的问题。不过,我建议两件事。

    首先,我会确保在您的域模型中添加和删除用户设备引用由域模型本身管理。换句话说,在 User 类上提供一个 behaviour 以保持 Device 对象的一致性,无论何时添加或删除 Device。

    addDevice(Device device) {
        if (device.user() != null) {
            device.user().removeDevice(device)
        }
        device.setUser(this)
        devices.add(device);
    }
    

    显然您还需要编写一个等效的removeDevice()。如果您通过用户管理它们,这将确保两个对象正确同步。如果您还打算从 Device 管理它们,则应在 Device 类上编写等效的 updateUser() 方法,以达到相同的效果。

    重点是:让你的领域模型来完成这项工作。它更容易推理(和测试),并且您不需要在持久性代码中的任何地方都调用 getter 和 setter 来保持一切同步。

    如果在进行了这些更改后仍然失败,则将 UNDIRECTED 关系设置为一侧为 INCOMING,另一侧为 OUTGOING(不管是哪一个)。如果这样可以解决问题,则表明 OGM 中可能存在错误。如果是哪种情况,请在这里报告!

    【讨论】:

    • Vince,我更改了您提到的关系,并且确实删除了关系(通过相同的代码 - 我只更改了关系类型)。我应该提交生成问题的代码 sn-p 吗?
    • 我发布了new issue on git hub,如果我能提供更多帮助,请告诉我。
    • 谢谢,我们会调查的。
    • 此修复适用于 1.1.6-SNAPSHOT 和 2.0.0-SNAPSHOT
    • Luanne,我目前还有 2-3 个问题找不到答案。你们希望我将它们发布到 stackoverflow 上,在 github 上打开一个问题,还是由你先运行它们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多