0

我在用户节点之间有双向 [: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);
}

此密码查询返回 UserA 的朋友,并且工作正常:

start user=node({0})
match (user)-[r?:FRIENDSHIP]->(friends)
where r.approved = true
return friends

此密码查询返回朋友的帖子,但不起作用(返回空结果):

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它时,在这两种情况下都会返回没有批准状态的朋友的帖子。

任何人都可以发现我在这里做错了什么吗?非常感谢。

4

1 回答 1

2

解决了。

不知道为什么,但是在一对多类型的关系中(例如,用户到发布)Neo4J 更喜欢集合上的传出关系,以及单个实体上的传入关系。我是反过来的...

现在我的课程看起来像这样:

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
于 2013-07-19T18:24:10.410 回答