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

解決しました。

理由はわかりませんが、1 対多のタイプの関係 (例: ユーザーから投稿) では、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 に答える