我正在尝试编写一个查询,根据常见的朋友和兴趣在Neo4j数据库中查找潜在的朋友。
我不想发布整个查询(部分学校作业),但这是重要部分
MATCH (me:User {firstname: "Name"}), (me)-[:FRIEND]->(friend:User)<-[:FRIEND]-(potential:User), (me)-[:MEMBER]->(i:Interest)
WHERE NOT (potential)-[:FRIEND]->(me)
WITH COLLECT(DISTINCT potential) AS potentialFriends,
COLLECT(DISTINCT friend) AS friends,
COLLECT(i) as interests
UNWIND potentialFriends AS potential
/*
@HANDLING_FINDINGS
Here I count common friends, interests and try to find relationships between
potential friends too -- hence the collect/unwind
*/
RETURN potential,
commonFriends,
commonInterests,
(commonFriends+commonInterests) as totalPotential
ORDER BY totalPotential DESC
LIMIT 10
在@HANDLING_FINDINGS部分,我使用找到的潜在朋友找到彼此之间的关系并计算他们的潜力(即共享朋友和共同兴趣的总和),然后按潜力排序。
问题是可能有没有朋友的用户我也想推荐一些朋友。
我的问题 - 我可以以某种方式将一些随机用户插入&#34;潜力&#34;研究结果如果他们的数量低于10,那么每个人都会得到推荐?
我尝试过这样的事情
...
UNWIND potentialFriends AS potential
CASE
WHEN (count(potential) < 10 )
...
但是一旦它开始CASE就会产生错误。我认为这种情况只能作为返回等命令的一部分使用? (也许只是回来)
使用第二个相关问题进行编辑: 我一直在考虑匹配所有用户,然后根据常见的朋友/用户对他们进行排名,但是不会搜索整个数据库是否密集?
答案 0 :(得分:1)
CASE
表达式可以在需要值的任何地方使用,但不能用作完整的子句。
关于您的主要问题,您可以在现有的WITH
和WITH
条款之间添加如下UNWIND
条款:
WITH friends, interests,
CASE WHEN SIZE(potentialFriends) < 10 THEN {randomFriends} ELSE potentialFriends END AS potentialFriends
如果potentialFriends
集合的大小小于10,则CASE
表达式会将{randomFriends}
parameter的值分配给potentialFriends
。
关于你的第二个问题,是的,它会很昂贵。