OEM 和自定义 Cypher 查询之间的 Neo4j SDN 不一致

Neo4j SDN inconsistency between OEM and custom Cypher queries

在从 SDN 3 移动到 SDN 4 以及从 Neo4j 2.3 移动到 Neo4j 3.0.1 时,我 运行 遇到了 OEM 和自定义 Cypher 查询之间不一致的问题。

我有以下 Cypher 查询:

@Query("MATCH ()-[r]-(cg:CriterionGroup) WHERE id(cg) = {criterionGroupId} DELETE cg, r")
void deleteCriterionGroup(@Param("criterionGroupId") Long criterionGroupId);

现在,对于 SDN 4,如果在 deleteCriterionGroup 方法调用后没有以下解决方法,此查询将无法工作:

session.clear();

能否请您展示正确的代码如何在 SDN 4 中删除 CriterionGroup now 以保持相关节点的引用一致。

这是我的数据架构:

如您所见 - CriterionGroup 连接到 DecisionCriterionUser 节点。

已更新

按照提示,我更新了我的方法:

@Override
public void deleteCriterionGroup(Long criterionGroupId) {
    CriterionGroup criterionGroup = criterionGroupRepository.findOne(criterionGroupId);
    criterionGroup.setAuthor(null);
    criterionGroup.setOwner(null);
    criterionGroup.setCriteria(null);
    criterionGroup = criterionGroupRepository.save(criterionGroup);
    criterionGroupRepository.delete(criterionGroup);
}

使用 OGM 删除关系可以保持一致性,前提是您的对象引用也得到维护。 如果您要删除 CriterionGroup,那么对于您的应用程序加载的任何相关实体(决策、标准、用户),您需要将其关联的 CriterionGroups 设置为 null,然后保存。如果加载了其中 none 个(如果将 CriterionGroup 加载到深度 0 则可能),那么您只需通过 repository/session 删除 CriterionGroup。混合加载和保存深度时要小心。

如果您想绕过 OGM 并使用自定义 Cypher 删除语句,那么,您必须清除会话(或使用新会话)并重新加载实体以使它们恢复与图形同步。