我在用户节点之间有双向[:FRIENDSHIP]关系:
(UserA)<-[:FRIENDSHIP {approved:true}]->(UserB)
这是Java中的一个小测试函数来设置关系:
public void approveFriendship(User requestor, User requestee) {
Friendship friendship = new Friendship(requestor, requestee);
friendship.setApproved(true);
Friendship invertedFriendship = new Friendship(requestee, requestor);
invertedFriendship.setApproved(true);
requestor.getFriendships().add(friendship);
requestee.getFriendships().add(invertedFriendship);
userRepository.save(requestor);
userRepository.save(requestee);
}
此cypher查询返回UserA的朋友,并且工作正常:
start user=node({0})
match (user)-[r?:FRIENDSHIP]->(friends)
where r.approved = true
return friends
此cypher查询返回朋友的帖子,但不起作用(返回空结果):
start n=node({0})
match (n)<-[r?:FRIENDSHIP]->(friend)<-[:AUTHOR]-(friendposts)
where r.approved = true
return friendposts order by friendposts.createdAt
如果省略where r.approved = true
行或将其更改为where r.approved = false
,则会在两种情况下都返回未获得批准状态的朋友帖子。
如果我在这里做错了,有人能发现吗?很有责任。
答案 0 :(得分:2)
解决了它。
Dunno为什么,但是在一对多的关系中(例如,User to Post)Neo4J更喜欢Collection上的传出关系,以及单个实体上的传入。我反过来了......
现在我的课程看起来像这样:
public class User {
@RelatedTo(type = "AUTHOR")
private Set<Post> posts;
}
public class POST {
@RelatedTo(type = "AUTHOR", direction = Direction.INCOMING)
private User author;
}
当然,密码查询必须改变以反映新的关系方向(注意作者背后的箭头):
start n=node({0})
match (n)<-[r?:FRIENDSHIP]->(friend)-[:AUTHOR]->(friendposts)
where r.approved = true
return friendposts order by friendposts.createdAt