【问题标题】:Neo4j:Deletes relationships automaticallyNeo4j:自动删除关系
【发布时间】:2017-01-31 06:05:28
【问题描述】:

我正在使用带有螺栓驱动器 2.0.6 的 spring data neo4j 版本 4.1.2。我面临自动破坏实体之间关系的问题。

我有一个名为组织的域,该组织属于许多实体,但我只提到少数。

组织架构

    public class Organization {

      private String formalName;
      private String shortName;

    @Relationship(type = COUNTRY)
        private Country country;

        @Relationship(type = HAS_GROUP)
        private List<Group> groupList = new ArrayList<>();
    }

国家架构是

public class Country {

@Relationship(type = HAS_HOLIDAY)
    private List< CountryHolidayCalender> countryHolidayCalenderList;

}

当我更新组织时,它会破坏国家/地区的所有关系,例如破坏国家/地区假期关系等

组织更新代码

Organization unit = organizationGraphRepository.findOne(unitId);
 unit.setFormalName(organizationGeneral.getFormalName());
 unit.setShortName(organizationGeneral.getShortName());
 organizationGraphRepository.save(unit);

我找不到,我做错了什么。请帮帮我,我们现在不能承受这种错误。

谢谢

【问题讨论】:

  • 您是否尝试过指定更大的深度来加载Organization 实体?例如organizationGraphRepository.findOne(unitId, 2)
  • 我明白了你的意思,当我通过 id 找到组织时,很少有关系出现,然后保存后只更新这些关系,其余的中断。因此,如果我必须更新大量关系数据,那么我应该为每个解决方案或任何其他解决方案编写自定义查询吗?

标签: neo4j spring-data-neo4j neo4j-bolt


【解决方案1】:

加载实体的默认深度为 1。这意味着findOne(id) 将仅返回给定实体 + 其直接连接的实体。 在您的情况下organization --&gt; country --&gt; CountryHolidayCalender,只会加载组织和相关国家/地区。

这可能是您看不到附加节点的原因。

save 跟踪对象状态,以检测更改并优化更新。 对于在 findsave 之间未更改的对象/属性,将不会更新数据库。

所以,只要不碰@Relationship注解的属性,就可以安全保存,即使没有加载也不会被修改。

关于您之前的评论,SDN 中没有用于动态深度检索的延迟加载(存在,已弃用)。所以,是的,你必须自己管理深度。 如果您的数据量不是太大,您可能希望一次加载所有内容(使用find(id, -1))。 另一种选择是按需加载,手动查询缺失的图表。

您可能还对this ticket 感兴趣,以便更好地控制实体加载。

【讨论】:

  • 你能给我一个问题的答案吗,如果我使用深度 2 加载图形并没有任何深度保存,是否有可能破坏关系?
  • 这应该是安全的,你的关系应该被保留
猜你喜欢
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
相关资源
最近更新 更多