结交朋友的朋友非常容易,我得到了这个似乎很有效。
g.v(1).in('FRIEND').in('FRIEND').filter{it != g.v(1)}
但我想做的只是找到有相同兴趣的朋友的朋友。下面我希望乔被建议Moe但不是Noe,因为他们没有相同的兴趣。
答案 0 :(得分:3)
你只需要扩展你的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()
基本上这是朋友的朋友,就像你以前一样,并以friend
的名义将位置保存在管道中。然后它出去相互喜欢并搜索原作
源节点。如果找到一个,它会跳回friend
。 dedup()
只会删除重复项,并可能加快遍历速度。
由于您未在图表中指明边缘方向,因此方向性可能不是100%正确。
答案 1 :(得分:2)
这必须在Gremlin吗?如果Cypher可以接受,你可以这样做:
START s=node(Joe)
MATCH s-[:FRIEND]-()-[:FRIEND]-fof, s-[:LIKES]-()-[:LIKES]-fof
WHERE s != fof
RETURN fof
答案 2 :(得分:0)
在不考虑常见喜欢的情况下查询相互朋友, 但如果他们有共同的喜欢它会成为最重要的。 看看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