2

交朋友的朋友很容易,我得到了这个似乎很好用。

g.v(1).in('FRIEND').in('FRIEND').filter{it != g.v(1)}

但我想做的只是结交志趣相投的朋友。下面我希望向 Joe 推荐 Moe 而不是 Noe,因为他们没有相同的兴趣。

图表的绘制

4

3 回答 3

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()

基本上,这会像以前一样发送给朋友的朋友,并将管道中的位置保存在 name 下friend。然后它出去相互喜欢并搜索原始源节点。如果它找到一个它会跳回来frienddedup()只是删除重复项并可能加快遍历速度。

由于您没有在图表中指示边缘的方向,因此其方向性可能不是 100% 正确。

于 2012-03-31T23:12:55.230 回答
2

这必须在Gremlin吗?如果 Cypher 是可以接受的,你可以这样做:

START s=node(Joe)
MATCH s-[:FRIEND]-()-[:FRIEND]-fof, s-[:LIKES]-()-[:LIKES]-fof
WHERE s != fof
RETURN fof
于 2012-03-31T05:00:05.057 回答
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;

如果您只想要常见的喜欢,请添加关注。健康)状况 -

Where sameInterest>0
于 2018-06-14T10:01:41.923 回答