Neo4j Cypher查询:如何获取二度好友共同选修的课程节点
解决方案
你需要的是所有二度好友选修课程的交集,可以通过统计好友总数、匹配每个课程的选修人数实现,正确Cypher查询如下:
MATCH (me:Person {uuid: '{my_id}'})-[:friendship*2]->(p:Person) WHERE p.uuid <> '{my_id}' WITH COLLECT(DISTINCT p) AS friend_list, COUNT(DISTINCT p) AS total_friends UNWIND friend_list AS friend MATCH (friend)-[:courses]->(c:Course) WITH c, COUNT(DISTINCT friend) AS course_taker_num, total_friends WHERE course_taker_num = total_friends RETURN COLLECT(DISTINCT c) AS common_courses
逻辑说明
- 首先筛选出所有排除自己的二度好友,去重后统计总人数
- 展开好友列表匹配各自选修的课程
- 按课程分组,统计选修该课程的好友数量
- 仅保留选修人数等于好友总人数的课程,即为所有好友共同选修的课程
你之前编写的查询没有生效,是因为all条件仅校验了选课关系的起始节点属于好友列表,没有判断该课程被所有好友关联,因此无法过滤出交集内容。
内容的提问来源于stack exchange,提问作者Alex Sukachov
相关产品推荐
相关产品推荐

