spring-data-neo4j 删除 nodeEntity 和所有引用的节点
spring-data-neo4j remove nodeEntity and all referenced nodes
我有一个简单的图形模型: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
语句来删除所有引用的节点可能会更好..
任何人都可以告诉我如何处理这个问题?任何帮助将不胜感激。谢谢!
我知道这已经有一段时间了,但是在使用 SDN
和 neo4j
一段时间后,似乎最好的方法是使用 Cypher
查询。
MATCH (user:User{id:'userId'})-[has:HAS]->(socialUser:SocialUser)
DELETE user, has, socialUser
借助 SDN,我们可以利用存储库:
@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);
}
希望对其他人有帮助
我有一个简单的图形模型: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
语句来删除所有引用的节点可能会更好..
任何人都可以告诉我如何处理这个问题?任何帮助将不胜感激。谢谢!
我知道这已经有一段时间了,但是在使用 SDN
和 neo4j
一段时间后,似乎最好的方法是使用 Cypher
查询。
MATCH (user:User{id:'userId'})-[has:HAS]->(socialUser:SocialUser)
DELETE user, has, socialUser
借助 SDN,我们可以利用存储库:
@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);
}
希望对其他人有帮助