2015-05-08 72 views
1

我有一個簡單的圖形模式: User具有ñSocialUser彈簧數據的Neo4j刪除nodeEntity和所有引用節點

我想知道是否有任何方式通過spring-data-neo4j自動刪除所有SocialUser當我刪除User實體。

這是我到目前爲止有:

域:

@NodeEntity 
public class User implements IdentifiableEntity<String> { 

    @GraphId 
    private Long nodeId; 
    // ... 

    @RelatedTo(type = "HAS", direction = Direction.OUTGOING) 
    Set<SocialUser> socialUsers = new HashSet<>(); 
} 

@NodeEntity 
public class SocialUser implements BasicNodeEntity { 

    @GraphId 
    private Long nodeId; 
    //... 

    @RelatedTo(type = "HAS", direction = Direction.INCOMING) 
    User user; 
} 

數據

After insert

我已經試過:

在這兩種情況下,刪除用戶,只User被刪除:

enter image description here

目前我已經封裝在User服務中的@Transactional方法中刪除兩個實體。就像這樣:

@Autowired 
    Neo4jOperations template; 

    @Transactional 
    public void delete(String userId) throws Exception { 
     User user = get(userId); 
     if (user == null) throw new ResourceNotFoundException("user not found"); 
     Set<SocialUser> socialUsers = template.fetch(user.getSocialUsers()); 
     for (SocialUser socialUser : socialUsers) template.delete(socialUser); 
     userRepository.delete(user); 
    } 

但我想這可能不是實現它的最好方法。我也認爲直接執行Cypher聲明刪除所有參考節點可能更好..

任何人都可以告訴我如何處理這個問題?任何幫助將不勝感激。謝謝!

+0

我知道它已經有一段時間,但我在同一個地方。你有沒有想出一個更清潔的解決方案? – Ceekay

+0

Hi @Ceekay。現在還沒有,我現在正在以我發問的相同方式進行操作。如果你找到更好的選擇,你可以發佈一個aswer。謝謝 – troig

+0

@Ceekay,經過一段時間的工作,我認爲最好的選擇是使用密碼查詢。查看我的答案以獲取更多信息。希望它有幫助 – troig

回答

2

我知道這已經有一段時間了,但在與SDNneo4j一起工作之後,似乎最好的方法是使用Cypher查詢。

MATCH (user:User{id:'userId'})-[has:HAS]->(socialUser:SocialUser) 
DELETE user, has, socialUser 

有了SDN,我們可以採取advantadge repositores的:

@Repository 
public interface UserRepository extends Neo4jRepository<User> { 

    @Query("MATCH (user:User{id:{id}})-[has:HAS]->(socialUser:SocialUser) DELETE user, has, socialUser") 
    void delete(String id); 
} 

希望它可以幫助其他人

+0

您應該將此標記爲答案,我認爲這是解決此問題的一種乾淨方式。 – Ceekay

+0

完成!謝謝@Ceekay – troig

相關問題