Neo4j 综合练习作业

发布于:2025-07-07 ⋅ 阅读:(13) ⋅ 点赞:(0)

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);

作业题目

基础查询

  1. 查询所有Person节点,只返回name属性
  2. 查询所有Movie节点,返回title和released属性
  3. 查询出演过"The Matrix"电影的所有演员的姓名
  4. 查询Keanu Reeves出演过的所有电影的标题

条件查询

  1. 查询1990年到2000年之间发布的电影
  2. 查询国籍不是"American"的演员
  3. 查询出演过至少2部电影的演员
  4. 查询既出演过电影又担任过导演的人

关系查询

  1. 查询Keanu Reeves的朋友(直接朋友,不包括朋友的朋友)
  2. 查询与Keanu Reeves有2跳关系的所有人(朋友的朋友)
  3. 查询与"The Matrix"电影相关的所有人(包括演员、导演、制片人)
  4. 查询共同出演过电影的演员对

聚合与排序

  1. 统计每部电影的演员数量,并按数量降序排列
  2. 查询每个演员出演的电影数量,并按数量降序排列
  3. 查询最年轻的5位演员

更新操作

  1. 为Keanu Reeves添加一个新的属性"gender",值为"male"
  2. 将"The Matrix"电影的tagline更新为"The one that started it all"
  3. 删除Emil Eifrem和Joel Silver之间的朋友关系
  4. 为电影"A Few Good Men"添加一个导演节点Rob Reiner(生于1947年,国籍American),并建立导演关系

路径查询

  1. 查找Keanu Reeves到Hugo Weaving的最短路径(任何关系都可以)

高级查询

  1. 使用OPTIONAL MATCH查询所有电影及其导演(如果有的话)
  2. 使用UNION查询所有加拿大籍的演员和美国籍的导演
  3. 使用CASE表达式为演员分类:出生在1960年前的为"Senior",1960-1970年的为"Middle-aged",1970年后的为"Young"
  4. 使用WITH和LIMIT查询出演电影最多的前3位演员

索引与约束

  1. 为Person节点的name属性创建唯一约束
  2. 为Movie节点的title属性创建索引

删除操作

  1. 删除电影"A Few Good Men"及其所有关系
  2. 删除所有没有出演任何电影的人员

作业答案

// 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 的使用有了全面的了解。


网站公告

今日签到

点亮在社区的每一天
去签到