Neo4j查询需求:列出选修同一课程的学生节点
如何用Cypher查询选修同一课程的学生节点?
场景说明
已通过以下Cypher语句在Neo4j中创建学生、课程节点及Follow选修关系:
CREATE (n0:Student { nb: '0', name: 'A' }) CREATE (n1:Student { nb: '1', name: 'B' }) CREATE (n2:Student { nb: '2', name: 'C' }) CREATE (n3:Student { nb: '3', name: 'D' }) CREATE (n4:Student { nb: '4', name: 'E' }) CREATE (c1:Course { course_nb: '1', course_name: 'Cryptography' }) CREATE (c2:Course { course_nb: '2', course_name: 'Big Data' }) CREATE (c3:Course { course_nb: '3', course_name: 'Cloud' }) CREATE (n1)-[:Follow]->(c1) CREATE (n2)-[:Follow]->(c1) CREATE (n3)-[:Follow]->(c1) CREATE (n3)-[:Follow]->(c2);
需求是查询出选修同一课程的学生节点,预期结果如下:
╒------------------╤------------------------╕ | "Students.name" | "Courses.course_name"| -------------------|----------------------- "B" | "Cryptography" "C" | "Cryptography" "D" | "Cryptography"
问题分析
之前尝试的MATCH(n:Course)<-[r:Follow]-(name) RETURN n语句存在两个问题:
- 仅返回课程节点,未提取学生的姓名信息;
- 没有筛选出有多个学生选修的课程,无法精准匹配预期结果。
正确的Cypher查询语句
1. 查询所有有至少2名学生选修的课程及对应学生
如果需要找出所有满足“同一课程被多个学生选修”的情况,使用以下语句:
MATCH (s:Student)-[:Follow]->(c:Course) WITH c, COLLECT(s.name) AS students WHERE SIZE(students) > 1 UNWIND students AS student_name RETURN student_name AS "Students.name", c.course_name AS "Courses.course_name" ORDER BY c.course_name, student_name
2. 仅查询指定课程(Cryptography)的选修学生
如果只需要获取Cryptography课程的选修学生,可直接指定课程名称过滤,语句更简洁:
MATCH (s:Student)-[:Follow]->(c:Course {course_name: 'Cryptography'}) RETURN s.name AS "Students.name", c.course_name AS "Courses.course_name" ORDER BY s.name
结果验证
执行第二种语句后,将得到与预期完全一致的输出:
╒------------------╤------------------------╕ | "Students.name" | "Courses.course_name"| -------------------|----------------------- "B" | "Cryptography" "C" | "Cryptography" "D" | "Cryptography"
内容的提问来源于stack exchange,提问作者petrados
相关产品推荐
相关产品推荐

