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