2016-05-29 2 views
0

При движении от SDN 3 к SDN 4 и от Neo4j 2.3 к Neo4j 3.0.1 я столкнулся с вопросом с несогласованностью между OEM и пользовательскими запросами Cypher.Neo4j SDN несоответствие между 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(); 

Не могли бы вы показать правильный код, как удалить CriterionGroup сейчас в SDN 4, чтобы поддерживать ссылки связанных узлов согласованы.

Это схема моих данных:

enter image description here

Как вы можете видеть - CriterionGroup подключен к Decision, Criterion и User узлов.

ОБНОВЛЕНО

Как было предложено, я обновил свой метод:

@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); 
} 
+0

Это довольно нормально, OGM не знает об изменениях, которые вы делаете в базе данных, если вы не скажете ему. Также имейте в виду, что sdn3 был построен вокруг встроенного gdb, в то время как sdn4 построен вокруг базы данных сервера и имеет реальную концепцию отображения данных –

+0

Это мой вопрос: какой правильный способ удалить этот узел с OGM? Я не хочу использовать обходные пути. – brunoid

+1

загрузить критерийГруппа и его отношения, удалить отношения с вашими POJO, session.save(); –

ответ

2

Использование OGM для удаления отношений сохраняет консистенцию, при условии, ваши ссылки на объекты сохраняются, а также. Если вы удаляете группу CriterionGroup, то для любых связанных объектов, загружаемых вашим приложением (решение, критерий, пользователь), вам необходимо установить соответствующие группы CriterionGroups в null и затем сохранить. Если ни одна из них не была загружена (возможно, если вы загрузили CriterionGroup на глубину 0), вы можете просто удалить CriterionGroup через репозиторий/сеанс. Будьте осторожны, если вы смешиваете загрузку и сохранение глубины.

Если вы хотите обойти OGM и использовать пользовательскую инструкцию Cypher delete, то вы должны очистить сеанс (или использовать новый) и повторно загрузить объекты, чтобы вернуть их в синхронизацию с графиком.

 Смежные вопросы

  • Нет связанных вопросов^_^