Neo4J双向关系查询与cypher

时间:2013-07-19 14:33:04

标签: neo4j cypher

我在用户节点之间有双向[: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,则会在两种情况下都返回未获得批准状态的朋友帖子。

如果我在这里做错了,有人能发现吗?很有责任。

1 个答案:

答案 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