2016-05-29 90 views
0

SDN 3SDN 4和從Neo4j 2.3Neo4j 3.0.1我遇到了OEM和定製Cypher查詢之間不一致的問題。Neo4j OEM和定製Cypher查詢之間的SDN不一致

我有以下的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以保持相關節點的引用一致。

這是我的數據的模式:

enter image description here

正如你所看到的 - 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); 
} 
+0

這是非常正常的,如果你不告訴他,OGM不知道你在數據庫中做了哪些修改。還要記住,sdn3是圍繞嵌入式gdb構建的,而sdn4是圍繞服務器數據庫構建的,並且具有真實的數據映射概念 –

+0

這是我的問題 - 使用OGM刪除此節點的正確方法是什麼?我不想使用解決方法。 – brunoid

+1

加載criteriaGroup和他的關係,刪除與POJO的關係session.save(); –

回答

2

使用OGM刪除關係保持一致性,只要你的對象引用保持爲好。 如果您要刪除CriterionGroup,那麼對於您的應用程序(Decision,Criterion,User)加載的任何相關實體,您需要將其關聯的CriterionGroups設置爲null,然後保存。如果沒有這些加載(如果您將CriterionGroup加載到深度0,則可能),那麼您可以簡單地通過存儲庫/會話刪除CriterionGroup。當你混合加載和保存深度時要小心。

如果要繞過OGM並使用定製的Cypher刪除語句,則必須清除會話(或使用新的會話)並重新加載實體以使其與圖形重新同步。