如何结交有相同兴趣的朋友的朋友?

时间:2012-03-31 00:46:06

标签: neo4j gremlin

结交朋友的朋友非常容易,我得到了这个似乎很有效。

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

但我想做的只是找到有相同兴趣的朋友的朋友。下面我希望乔被建议Moe但不是Noe,因为他们没有相同的兴趣。

Drawing of graph

3 个答案:

答案 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的名义将位置保存在管道中。然后它出去相互喜欢并搜索原作 源节点。如果找到一个,它会跳回frienddedup()只会删除重复项,并可能加快遍历速度。

由于您未在图表中指明边缘方向,因此方向性可能不是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