删除 Spring Data Neo4j 中的简单关系
Removing simple Relationships in Spring Data Neo4j
晚上好,
我正在使用 SDN 3,并且 运行 遇到了在我的基础图中删除简单关系 (RelateTo) 的问题。场景是我想在我的网络应用程序中的用户之间建立一个 Friend request/approval 系统。通过在用户之间创建 "HAS_REQUESTED" 关系来发出请求没有问题。但是一旦收到好友请求的用户点击 "approve",就建立了 "FRIENDS_WITH" 关系,而没有正确删除 "HAS_REQUESTED" 关系。下面的代码演示了整个过程:
相关的Controller方法
@RequestMapping(value="/approve/friend/{friendId}")
public String approveFriend(@PathVariable("friendId") String friendId){
User me = userService.findByEmail(userService.getAuthenticatedUser().getName());
userService.removeOldRequests(friendId, me);
userService.approveFriendship(friendId, me);
return "redirect:/friends";
}
有问题的 UserService 方法。 'me' 是最初向 'friendId/friend' 发送好友请求的经过身份验证的用户:
public void removeOldRequests(String friendId, User me){
try{
User friend = userRepository.findByUserId(friendId);
friend.addStartNodeForUsersRequestingMe(me, false);
template.save(friend);
}catch(Exception e){
e.printStackTrace();
}
这是我的用户实体节点(不包括不相关的 fields/getters/setters。)
@NodeEntity
public class 用户 {
@GraphId Long nodeId;
@Indexed
String userId;
String username;
String firstName;
String lastName;
String email;
String aboutMe;
String Quote;
String favoriteBook;
int age;
Date userCreation;
String sex;
String password;
Role role;
byte[] picture;
@RelatedTo(type="FRIENDS_WITH", direction=Direction.BOTH)
@Fetch
Set<User> friends;
@RelatedTo(type="HAS_FRIEND_REQUEST")
@Fetch
Set<User> startNodeForUsersRequestingMe;
@RelatedTo(type="HAS_FRIEND_REQUEST", direction=Direction.INCOMING)
@Fetch
Set<User> UsersWhoHaveRequestedMe;
public void addStartNodeForUsersRequestingMe(User user, boolean flag){
if(flag){
this.startNodeForUsersRequestingMe.add(user);
}else{
this.startNodeForUsersRequestingMe.remove(user);
}
}
public void addUsersWhoHaveRequestedMe(User user, boolean flag){
if(flag){
this.UsersWhoHaveRequestedMe.add(user);
}else{
this.UsersWhoHaveRequestedMe.remove(user);
}
}
我用来 return 当前用户的好友请求的存储库方法如下。现在它被配置为 return 用户拥有的任何关系 "HAS_FRIEND_REQUEST" 只是为了测试目的,看看我是否可以让用户 A 和用户 B 的一个朋友请求不是 return编辑。
@Query("START user=node({0})"
+"MATCH (user)-[:HAS_FRIEND_REQUEST]-(friend)"
+ "return friend;")
Iterable getUserFriendRequests(用户用户);
任何关于如何以干净的方式正确删除 "HAS_FRIEND_REQUEST" 的指导将不胜感激。或者,也许是处理 "friend request Handshake" 想法的更好方法。如果您对我有任何问题或疑虑,请随时告诉我。
您可以从集合中移除目标用户
或使用 Neo4jTemplate 方法删除关系。
template.deleteRelationshipBetween(Object start, Object end, String type)
晚上好,
我正在使用 SDN 3,并且 运行 遇到了在我的基础图中删除简单关系 (RelateTo) 的问题。场景是我想在我的网络应用程序中的用户之间建立一个 Friend request/approval 系统。通过在用户之间创建 "HAS_REQUESTED" 关系来发出请求没有问题。但是一旦收到好友请求的用户点击 "approve",就建立了 "FRIENDS_WITH" 关系,而没有正确删除 "HAS_REQUESTED" 关系。下面的代码演示了整个过程:
相关的Controller方法
@RequestMapping(value="/approve/friend/{friendId}")
public String approveFriend(@PathVariable("friendId") String friendId){
User me = userService.findByEmail(userService.getAuthenticatedUser().getName());
userService.removeOldRequests(friendId, me);
userService.approveFriendship(friendId, me);
return "redirect:/friends";
}
有问题的 UserService 方法。 'me' 是最初向 'friendId/friend' 发送好友请求的经过身份验证的用户:
public void removeOldRequests(String friendId, User me){
try{
User friend = userRepository.findByUserId(friendId);
friend.addStartNodeForUsersRequestingMe(me, false);
template.save(friend);
}catch(Exception e){
e.printStackTrace();
}
这是我的用户实体节点(不包括不相关的 fields/getters/setters。)
@NodeEntity
public class 用户 {
@GraphId Long nodeId;
@Indexed
String userId;
String username;
String firstName;
String lastName;
String email;
String aboutMe;
String Quote;
String favoriteBook;
int age;
Date userCreation;
String sex;
String password;
Role role;
byte[] picture;
@RelatedTo(type="FRIENDS_WITH", direction=Direction.BOTH)
@Fetch
Set<User> friends;
@RelatedTo(type="HAS_FRIEND_REQUEST")
@Fetch
Set<User> startNodeForUsersRequestingMe;
@RelatedTo(type="HAS_FRIEND_REQUEST", direction=Direction.INCOMING)
@Fetch
Set<User> UsersWhoHaveRequestedMe;
public void addStartNodeForUsersRequestingMe(User user, boolean flag){
if(flag){
this.startNodeForUsersRequestingMe.add(user);
}else{
this.startNodeForUsersRequestingMe.remove(user);
}
}
public void addUsersWhoHaveRequestedMe(User user, boolean flag){
if(flag){
this.UsersWhoHaveRequestedMe.add(user);
}else{
this.UsersWhoHaveRequestedMe.remove(user);
}
}
我用来 return 当前用户的好友请求的存储库方法如下。现在它被配置为 return 用户拥有的任何关系 "HAS_FRIEND_REQUEST" 只是为了测试目的,看看我是否可以让用户 A 和用户 B 的一个朋友请求不是 return编辑。
@Query("START user=node({0})"
+"MATCH (user)-[:HAS_FRIEND_REQUEST]-(friend)"
+ "return friend;")
Iterable getUserFriendRequests(用户用户);
任何关于如何以干净的方式正确删除 "HAS_FRIEND_REQUEST" 的指导将不胜感激。或者,也许是处理 "friend request Handshake" 想法的更好方法。如果您对我有任何问题或疑虑,请随时告诉我。
您可以从集合中移除目标用户 或使用 Neo4jTemplate 方法删除关系。
template.deleteRelationshipBetween(Object start, Object end, String type)