ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

TuGraph图数据库 实验1——图模型构建、增删改查、路径与聚合查询

TuGraph图数据库 实验1——图模型构建、增删改查、路径与聚合查询

实验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)相连。建模遵循以下原则:

  1. 实体即点:person 表示参与制作的个人(导演/制片人),movie 表示影片;
  2. 关系即边:produce 表示"谁出品了哪部电影",设为有向边,方向表达制作关系,便于沿 (p:person)-[:produce]->(m:movie) 做聚合分析;
  3. 属性与主键:点的属性直接映射 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 n

SET 用于新增或修改节点/关系的属性。为刚创建的 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 DESC

  • MATCH (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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进