Neo4j 如何在有相同兴趣的朋友中找到朋友?

Neo4j 如何在有相同兴趣的朋友中找到朋友?,neo4j,gremlin,Neo4j,Gremlin,交朋友的朋友是很容易的,我得到了这个似乎工作得很好 g.v(1).in('FRIEND').in('FRIEND').filter{it != g.v(1)} 但我想做的是,只交到兴趣相同的朋友的朋友。下面我希望乔被推荐为Moe而不是Noe,因为他们没有相同的兴趣 这一定要在Gremlin中吗?如果Cypher是可接受的,您可以执行以下操作: START s=node(Joe) MATCH s-[:FRIEND]-()-[:FRIEND]-fof, s-[:LIKES]-()-[:LIKES]

交朋友的朋友是很容易的,我得到了这个似乎工作得很好

g.v(1).in('FRIEND').in('FRIEND').filter{it != g.v(1)}
但我想做的是,只交到兴趣相同的朋友的朋友。下面我希望乔被推荐为Moe而不是Noe,因为他们没有相同的兴趣


这一定要在Gremlin中吗?如果Cypher是可接受的,您可以执行以下操作:

START s=node(Joe)
MATCH s-[:FRIEND]-()-[:FRIEND]-fof, s-[:LIKES]-()-[:LIKES]-fof
WHERE s != fof
RETURN fof

您只需扩展您的gremlin遍历,就可以越过类似的边缘:

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%正确,因为您在图表中没有指示边的方向。

查询以获得共同的朋友,而不考虑共同的喜好, 但如果你和他们有共同的爱好,它会排在首位。 请按顺序看一看

    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;

我正在使用neo4jClient,所以如果另一个无法正常工作,我可以试试这个。谢谢教授,我忘了加箭头,那会有帮助的。在我的模型中,FRIEND是双向的,类似于从用户节点开始,到语言节点结束。所以这是可行的:g.v(1).in('FRIEND').in('FRIEND').filter{it!=g.v(1)}.dedup().as('fof').out('LIKES').in('LIKES').filter{it==g.v(1)}.back('fof').dedup()
Where sameInterest>0