Neo4j - 如果找到的结果很少,则使用替代匹配完成查询

时间:2016-05-01 17:22:51

标签: neo4j graph-databases

我正在尝试编写一个查询,根据常见的朋友和兴趣在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就会产生错误。我认为这种情况只能作为返回等命令的一部分使用? (也许只是回来)

使用第二个相关问题进行编辑: 我一直在考虑匹配所有用户,然后根据常见的朋友/用户对他们进行排名,但是不会搜索整个数据库是否密集?

1 个答案:

答案 0 :(得分:1)

CASE表达式可以在需要值的任何地方使用,但不能用作完整的子句。

关于您的主要问题,您可以在现有的WITHWITH条款之间添加如下UNWIND条款:

WITH friends, interests,
  CASE WHEN SIZE(potentialFriends) < 10 THEN {randomFriends} ELSE potentialFriends END AS potentialFriends

如果potentialFriends集合的大小小于10,则CASE表达式会将{randomFriends} parameter的值分配给potentialFriends

关于你的第二个问题,是的,它会很昂贵。