2015-05-08 2 views
1

У меня есть простая модель графа: User имеет NSocialUser.пружинные данные 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

На данный момент я инкапсулированные удаление обоих объектов в методе @Transactional в службе User. Что-то вроде этого:

@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

Привет @Ceekay. Пока нет, на данный момент я делаю то же самое, что и в своем вопросе. Если вы найдете лучший выбор, вы можете разместить авайер. Спасибо – troig

+0

@Ceekay, Поработав над этим, я считаю, что лучший выбор - использовать запрос cypher. См. Мой ответ для получения дополнительной информации. Надеюсь, это поможет – troig

ответ

2

Я знаю, что это было какое-то время, но после того, как мы работаем с SDN и neo4j, кажется, что лучший способ добиться этого - использовать запрос 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

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