Neo4j 综合练习作业
Neo4j 综合练习作业
作业说明
这个作业涵盖了 Neo4j 的多个重要知识点,包括节点和关系的创建、查询、更新、删除以及高级查询功能。请使用 Cypher 语句完成以下所有题目。
数据准备
首先执行以下语句创建示例数据:
ACTED_IN: 表示出演关系
DIRECTED: 表示导演关系
PRODUCED: 制片关系
FRIENDS_WITH: 朋友关系
// 创建人物节点
CREATE
(keanu:Person {name: 'Keanu Reeves', born: 1964, nationality: 'Canadian'}),
(laurence:Person {name: 'Laurence Fishburne', born: 1961, nationality: 'American'}),
(carrie:Person {name: 'Carrie-Anne Moss', born: 1967, nationality: 'Canadian'}),
(lana:Person {name: 'Lana Wachowski', born: 1965, nationality: 'American'}),
(lilly:Person {name: 'Lilly Wachowski', born: 1967, nationality: 'American'}),
(joel:Person {name: 'Joel Silver', born: 1952, nationality: 'American'}),
(hugo:Person {name: 'Hugo Weaving', born: 1960, nationality: 'Australian'}),
(emil:Person {name: 'Emil Eifrem', born: 1978, nationality: 'Swedish'}),// 创建电影节点
(matrix:Movie {title: 'The Matrix', released: 1999, tagline: 'Welcome to the Real World'}),
(matrix2:Movie {title: 'The Matrix Reloaded', released: 2003, tagline: 'Free your mind'}),
(matrix3:Movie {title: 'The Matrix Revolutions', released: 2003, tagline: 'Everything that has a beginning has an end'}),
(devils:Movie {title: 'The Devils Advocate', released: 1997, tagline: 'Evil has its winning ways'}),
(few:Movie {title: 'A Few Good Men', released: 1992, tagline: 'In the heart of the nation\'s capital, in a courthouse of the U.S. government, one man will stop at nothing to keep his honor, and one will stop at nothing to find the truth.'}),// 创建关系
(keanu)-[:ACTED_IN {roles: ['Neo']}]->(matrix),
(keanu)-[:ACTED_IN {roles: ['Neo']}]->(matrix2),
(keanu)-[:ACTED_IN {roles: ['Neo']}]->(matrix3),
(keanu)-[:ACTED_IN {roles: ['Kevin Lomax']}]->(devils),
(laurence)-[:ACTED_IN {roles: ['Morpheus']}]->(matrix),
(laurence)-[:ACTED_IN {roles: ['Morpheus']}]->(matrix2),
(laurence)-[:ACTED_IN {roles: ['Morpheus']}]->(matrix3),
(carrie)-[:ACTED_IN {roles: ['Trinity']}]->(matrix),
(carrie)-[:ACTED_IN {roles: ['Trinity']}]->(matrix2),
(carrie)-[:ACTED_IN {roles: ['Trinity']}]->(matrix3),
(hugo)-[:ACTED_IN {roles: ['Agent Smith']}]->(matrix),
(hugo)-[:ACTED_IN {roles: ['Agent Smith']}]->(matrix2),
(hugo)-[:ACTED_IN {roles: ['Agent Smith']}]->(matrix3),
(emil)-[:ACTED_IN {roles: ['Emil']}]->(matrix),
(lana)-[:DIRECTED]->(matrix),
(lana)-[:DIRECTED]->(matrix2),
(lana)-[:DIRECTED]->(matrix3),
(lilly)-[:DIRECTED]->(matrix),
(lilly)-[:DIRECTED]->(matrix2),
(lilly)-[:DIRECTED]->(matrix3),
(joel)-[:PRODUCED]->(matrix),
(joel)-[:PRODUCED]->(matrix2),
(joel)-[:PRODUCED]->(matrix3),// 创建一些朋友关系
(keanu)-[:FRIENDS_WITH]->(emil),
(keanu)-[:FRIENDS_WITH]->(carrie),
(carrie)-[:FRIENDS_WITH]->(laurence),
(emil)-[:FRIENDS_WITH]->(joel);
作业题目
基础查询
- 查询所有Person节点,只返回name属性
- 查询所有Movie节点,返回title和released属性
- 查询出演过"The Matrix"电影的所有演员的姓名
- 查询Keanu Reeves出演过的所有电影的标题
条件查询
- 查询1990年到2000年之间发布的电影
- 查询国籍不是"American"的演员
- 查询出演过至少2部电影的演员
- 查询既出演过电影又担任过导演的人
关系查询
- 查询Keanu Reeves的朋友(直接朋友,不包括朋友的朋友)
- 查询与Keanu Reeves有2跳关系的所有人(朋友的朋友)
- 查询与"The Matrix"电影相关的所有人(包括演员、导演、制片人)
- 查询共同出演过电影的演员对
聚合与排序
- 统计每部电影的演员数量,并按数量降序排列
- 查询每个演员出演的电影数量,并按数量降序排列
- 查询最年轻的5位演员
更新操作
- 为Keanu Reeves添加一个新的属性"gender",值为"male"
- 将"The Matrix"电影的tagline更新为"The one that started it all"
- 删除Emil Eifrem和Joel Silver之间的朋友关系
- 为电影"A Few Good Men"添加一个导演节点Rob Reiner(生于1947年,国籍American),并建立导演关系
路径查询
- 查找Keanu Reeves到Hugo Weaving的最短路径(任何关系都可以)
高级查询
- 使用OPTIONAL MATCH查询所有电影及其导演(如果有的话)
- 使用UNION查询所有加拿大籍的演员和美国籍的导演
- 使用CASE表达式为演员分类:出生在1960年前的为"Senior",1960-1970年的为"Middle-aged",1970年后的为"Young"
- 使用WITH和LIMIT查询出演电影最多的前3位演员
索引与约束
- 为Person节点的name属性创建唯一约束
- 为Movie节点的title属性创建索引
删除操作
- 删除电影"A Few Good Men"及其所有关系
- 删除所有没有出演任何电影的人员
作业答案
// 1. 查询所有Person节点,只返回name属性
MATCH (p:Person) RETURN p.name;// 2. 查询所有Movie节点,返回title和released属性
MATCH (m:Movie) RETURN m.title, m.released;// 3. 查询出演过"The Matrix"电影的所有演员的姓名
MATCH (p:Person)-[:ACTED_IN]->(m:Movie {title: 'The Matrix'}) RETURN p.name;// 4. 查询Keanu Reeves出演过的所有电影的标题
MATCH (p:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(m:Movie) RETURN m.title;// 5. 查询1990年到2000年之间发布的电影
MATCH (m:Movie) WHERE m.released >= 1990 AND m.released <= 2000 RETURN m;// 6. 查询国籍不是"American"的演员
MATCH (p:Person) WHERE p.nationality <> 'American' RETURN p.name;// 7. 查询出演过至少2部电影的演员
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WITH p, count(m) AS movieCount
WHERE movieCount >= 2
RETURN p.name, movieCount;// 8. 查询既出演过电影又担任过导演的人
MATCH (p:Person)-[:ACTED_IN]->(:Movie), (p)-[:DIRECTED]->(:Movie)
RETURN DISTINCT p.name;// 9. 查询Keanu Reeves的朋友
MATCH (p:Person {name: 'Keanu Reeves'})-[:FRIENDS_WITH]->(friend)
RETURN friend.name;// 10. 查询与Keanu Reeves有2跳关系的所有人
MATCH (p:Person {name: 'Keanu Reeves'})-[:FRIENDS_WITH*2]->(friendOfFriend)
RETURN DISTINCT friendOfFriend.name;// 11. 查询与"The Matrix"电影相关的所有人
MATCH (p:Person)-[r]->(m:Movie {title: 'The Matrix'})
RETURN p.name, type(r) AS role;// 12. 查询共同出演过电影的演员对
MATCH (p1:Person)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(p2:Person)
WHERE p1 <> p2
RETURN p1.name, p2.name, m.title;// 13. 统计每部电影的演员数量
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person)
RETURN m.title, count(p) AS actorCount
ORDER BY actorCount DESC;// 14. 查询每个演员出演的电影数量
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
RETURN p.name, count(m) AS movieCount
ORDER BY movieCount DESC;// 15. 查询最年轻的5位演员
MATCH (p:Person)
RETURN p.name, p.born
ORDER BY p.born DESC
LIMIT 5;// 16. 为Keanu Reeves添加gender属性
MATCH (p:Person {name: 'Keanu Reeves'})
SET p.gender = 'male'
RETURN p;// 17. 更新"The Matrix"的tagline
MATCH (m:Movie {title: 'The Matrix'})
SET m.tagline = 'The one that started it all'
RETURN m;// 18. 删除Emil Eifrem和Joel Silver之间的朋友关系
MATCH (e:Person {name: 'Emil Eifrem'})-[r:FRIENDS_WITH]->(j:Person {name: 'Joel Silver'})
DELETE r;// 19. 为"A Few Good Men"添加导演
CREATE (rob:Person {name: 'Rob Reiner', born: 1947, nationality: 'American'});
MATCH (m:Movie {title: 'A Few Good Men'}), (p:Person {name: 'Rob Reiner'})
CREATE (p)-[:DIRECTED]->(m);// 20. 查找Keanu Reeves到Hugo Weaving的最短路径
MATCH path = shortestPath((k:Person {name: 'Keanu Reeves'})-[*]-(h:Person {name: 'Hugo Weaving'}))
RETURN path;// 21. 使用OPTIONAL MATCH查询所有电影及其导演
MATCH (m:Movie)
OPTIONAL MATCH (d:Person)-[:DIRECTED]->(m)
RETURN m.title, d.name AS director;// 22. 使用UNION查询所有加拿大籍的演员和美国籍的导演
MATCH (p:Person {nationality: 'Canadian'})-[:ACTED_IN]->(:Movie)
RETURN p.name AS name, 'Actor' AS role
UNION
MATCH (p:Person {nationality: 'American'})-[:DIRECTED]->(:Movie)
RETURN p.name AS name, 'Director' AS role;// 23. 使用CASE表达式为演员分类
MATCH (p:Person)
RETURN p.name,
CASE WHEN p.born < 1960 THEN 'Senior'WHEN p.born >= 1960 AND p.born < 1970 THEN 'Middle-aged'ELSE 'Young'
END AS ageGroup;// 24. 使用WITH和LIMIT查询出演电影最多的前3位演员
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WITH p, count(m) AS movieCount
ORDER BY movieCount DESC
LIMIT 3
RETURN p.name, movieCount;// 25. 为Person节点的name属性创建唯一约束
CREATE CONSTRAINT unique_person_name FOR (p:Person) REQUIRE p.name IS UNIQUE;// 26. 为Movie节点的title属性创建索引
CREATE INDEX movie_title_index FOR (m:Movie) ON (m.title);// 27. 删除电影"A Few Good Men"及其所有关系
MATCH (m:Movie {title: 'A Few Good Men'})
DETACH DELETE m;// 28. 删除所有没有出演任何电影的人员
MATCH (p:Person)
WHERE NOT (p)-[:ACTED_IN]->()
DELETE p;
这个作业涵盖了 Neo4j 和 Cypher 的大部分核心功能,包括 CRUD 操作、各种查询模式、路径查找、聚合函数、索引和约束等。完成这个作业后,你应该对 Neo4j 的使用有了全面的了解。