友達の友達を作るのはとても簡単です。私はこれを手に入れました。
g.v(1).in('FRIEND').in('FRIEND').filter{it != g.v(1)}
しかし、私がやりたいのは、同じ興味を持つ友達の友達だけを獲得することです. 以下では、Joe に Moe を提案してもらいたいのですが、Noe ではなく、彼らは同じ興味を持っていないためです。
グレムリンのトラバーサルを拡張して、LIKES エッジも通過する必要があります。
g.v(1).in('FRIEND').in('FRIEND').filter{it != g.v(1)}.dedup() \
as('friend').in('LIKES').out('LIKES').filter{it == g.v(1)}. \
back('friend').dedup()
基本的に、これは以前のように友人の友人に送信され、名前でパイプ内の位置が保存されますfriend
。次に、相互のいいね! に出て、元のソース ノードを検索します。見つかった場合は、ジャンプして戻りfriend
ます。dedup()
重複を削除するだけで、トラバーサルが高速化される場合があります。
ダイアグラムでエッジの方向を示していないため、この方向性は 100% 正しいとは限りません。
これはGremlinにある必要がありますか? Cypher が受け入れられる場合は、次のことができます。
START s=node(Joe)
MATCH s-[:FRIEND]-()-[:FRIEND]-fof, s-[:LIKES]-()-[:LIKES]-fof
WHERE s != fof
RETURN fof
共通のいいねを考慮せずに相互の友達を取得するためのクエリですが、共通のいいねがあればそれが上位になります。Order by を見てください。
MATCH (me:User{userid:'34219'})
MATCH (me)-[:FRIEND]-()-[:FRIEND]-(potentialFriend)
WITH me, potentialFriend, COUNT(*) AS friendsInCommon
WITH me,
potentialFriend,
SIZE((potentialFriend)-[:LIKES]->()<-[:LIKES]-(me)) AS sameInterest,
friendsInCommon
WHERE NOT (me)-[:FRIEND]-(potentialFriend)
RETURN potentialFriend, sameInterest, friendsInCommon,
friendsInCommon + sameInterest AS score
ORDER BY score DESC;
一般的ないいねのみが必要な場合は、foll を追加します。調子 -
Where sameInterest>0