交朋友的朋友很容易,我得到了这个似乎很好用。
g.v(1).in('FRIEND').in('FRIEND').filter{it != g.v(1)}
但我想做的只是结交志趣相投的朋友。下面我希望向 Joe 推荐 Moe 而不是 Noe,因为他们没有相同的兴趣。

您只需要扩展您的 gremlin 遍历即可越过 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()
基本上,这会像以前一样发送给朋友的朋友,并将管道中的位置保存在 name 下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;
如果您只想要常见的喜欢,请添加关注。健康)状况 -
Where sameInterest>0