【发布时间】:2015-07-19 18:00:10
【问题描述】:
我有一个简单的图模型:1 User 有 N SocialUser。
我想知道当我删除 User 实体时,是否有任何方法可以通过 spring-data-neo4j 自动删除所有引用的 SocialUser。
这是我目前得到的:
域:
@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;
}
数据:
我的尝试:
- 通过GraphRepository删除用户
- 通过Neo4jTemplate删除用户
在这两种情况下,只有User 被删除:
目前,我已将两个实体的删除封装在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 语句来删除所有引用的节点..
谁能告诉我如何处理这个问题?任何帮助将不胜感激。谢谢!
【问题讨论】:
-
我知道已经有一段时间了,但我在同一个地方。你想出了更清洁的解决方案吗?
-
嗨@Ceekay。还没有,目前我正在以与我在问题中发布的方式相同的方式进行操作。如果您找到更好的选择,您可以发布一个回答。谢谢
-
@Ceekay,经过一段时间的研究,我认为最好的选择是使用密码查询。有关更多信息,请参阅我的答案。希望对你有帮助
标签: java neo4j cypher spring-data spring-data-neo4j