实验1——基于TuGraph平台进行图模型构建、增删改查、路径与聚合查询
1. 成功启动TuGraph平台
通过TuGraph服务实例部署文档,点击部署链接跳转。
申请试用,按照提示填写信息修改密码,并勾选协议 → 点击"开始免费使用" → 实例创建成功,在审核通过后就可以创建TuGraph服务。
等待实例资源分配,实例创建完成后进入实例详情页面,查看实例状态。当状态显示“已部署”时,后台TuGraph服务部署完成。
在实例详情页面获取关键连接信息:
- Browser网页访问地址:
http:// . . . : - 数据库访问密码:
..... - Bolt协议端口:
. . . :
复制browser链接,在浏览器打开TuGraph Studio登录页面。输入默认账号admin,填写实例对应的访问密码,点击登录,进入TuGraph可视化管理首页。
图数据库登录成功,进入 TuGraph Browser 主界面
2. 模型建立、数据导入、增删改查
(1)模型建立
新建图
添加点类型 person在右侧“添加点类型"表单里
名称 person,依次添加属性 id(INT32)、name(STRING)、born(INT32)、poster_image(STRING)。
同样方式添加点类型 movie
名称 movie,添加 id(INT32)、title(STRING)、tagline(STRING)、summary(STRING)、duration(INT32)、rated(STRING);
添加边类型 produce
名称 produce,起点 person、终点 movie。
模型设计说明
本数据集描述"人物—制作—电影"的关联,本质是一个二部图:person 与 movie 两类实体,仅通过有向关系 produce(person→movie)相连。建模遵循以下原则:
- 实体即点:person 表示参与制作的个人(导演/制片人),movie 表示影片;
- 关系即边:produce 表示"谁出品了哪部电影",设为有向边,方向表达制作关系,便于沿 (p:person)-[:produce]->(m:movie) 做聚合分析;
- 属性与主键:点的属性直接映射 CSV 列;id 设为主键以保证实体唯一性并支撑数据导入时的匹配;born、poster_image、summary、rated 在原数据中允许缺失,建模时不设为主键、允许为空。
(2)数据导入
① person.csv
列映射:第1列→id(主键),第2列→name,第3列→born,第4列→poster_image
② movie.csv
列映射(共 7 列):第1→id(主键),第2→title,第3→tagline,第4→summary,第5→poster_image,第6→duration,第7→rated
② produce.csv
起点:person,起点ID列 = 第1列(person_id)
终点:movie,终点ID列 = 第2列(movie_id)
(3)“增删改查”
① 查
a.查询所有节点
MATCH (n) RETURN n返回全部节点,用于确认数据已导入
b.按标签匹配节点
MATCH (n:person) RETURN n按标签 :person 过滤,只返回人物节点
c. 按标签+属性匹配节点
MATCH (n:person {name:'Martin Scorsese'}) RETURN n标签+属性精确匹配,定位导演 Martin Scorsese
d.匹配任意关系
MATCH p = (n)-[r]->(m) RETURN p返回"节点—关系—节点"路径
e.过滤匹配
MATCH (n:person)-[:produce]->(m:movie) WHERE n.name = 'Peter Jackson' RETURN m.title沿 produce 关系边,从人物找其出品的电影;[:produce] 指定关系类型,(m:movie) 限制终点为电影,WHERE 限定人物名为 Peter Jackson,RETURN m.title 只返回电影标题。
② 增
a.创建节点
先建两个节点,再"先匹配后连接"创建一条 produce 关系
CREATE (n:person {name:'James Wan', id:10000, born:1977}) CREATE (n:movie {title:'Fast & Furious 7', id:10001})CREATE 在图中新建节点,括号内声明标签与属性。新增人物 James Wan 与电影 Fast & Furious 7;id 取较大值(10000/10001)以避开导入数据的主键范围,避免冲突。
b,创建关系
MATCH (n:person),(m:movie) WHERE n.name = 'James Wan' AND m.title = 'Fast & Furious 7' CREATE (n)-[r:produce]->(m) RETURN r创建关系的安全范式是"先 MATCH 到两端节点,再用 CREATE 连边"。(n)-[r:produce]->(m) 在 n 与 m 间建立有向 produce 关系,方向表达"James Wan 制作了 Fast & Furious 7"。
③ 改
MATCH (n:person {name:'James Wan'}) SET n.poster_image = 'https://example.com/jameswan.jpg' RETURN nSET 用于新增或修改节点/关系的属性。为刚创建的 James Wan 节点补充 poster_image 字段;若属性已存在,SET 则覆盖其值。
④ 删
REMOVE 删除属性或标签;DELETE 删除节点/关系。
图数据库有引用完整性约束——删除带关系的节点时,必须把相连的边一并删除(-[r]-() 匹配任意方向的关联边,DELETE n, r 同时删除),否则会报约束错误。
MATCH (n:person {name:'James Wan'}) REMOVE n.poster_image RETURN n仅删除属性
MATCH (n:person {name:'James Wan'})-[r]-() DELETE n, r删除节点及其全部关联边
(4)聚合查询
①
统计每位制作人参与出品的电影数量,按数量降序,并只保留"高产"(≥2 部)的制作人。
MATCH (p:person)-[:produce]->(m:movie) WITH p, COUNT(m) AS movieCount WHERE movieCount >= 2 RETURN p.name AS producer, movieCount ORDER BY movieCount DESCMATCH (p:person)-[:produce]->(m:movie)沿关系边把"人"和"电影"关联;WITH p, COUNT(m) AS movieCount做多阶段聚合;WHERE movieCount >= 2在聚合后过滤(必须用 WITH 后才能对聚合结果过滤);ORDER BY movieCount DESC降序排列。
②
从 movie 节点的 rated 属性出发,统计各评级电影数量,反映数据集中影片的分级构成。
MATCH (m:movie) RETURN m.rated AS rating, COUNT(*) AS cnt ORDER BY cnt DESC