2.2 MATCH 起步:从单个节点到子图


文档摘要

2.2 MATCH 起步:从单个节点到子图 本节摘要:MATCH 是 Cypher 的"出发点"。本节从锚定单个节点讲起,逐步加入属性匹配、关系方向与类型、多重标签,最后用 WHERE 精细筛选、用 RETURN 取回结果,完成 Cypher 读查询的最小闭环。每个语法点都配可运行查询与预期输出,全部基于第 1 章装好的 Movie 沙盘。 上一节把地图画好,本节开始行走。MATCH 的心智模型一句话:你描述一个子图的形状,引擎去图里找所有长得像它的实例。这不是循环遍历,而是"模式匹配"——理解了这一点,后面所有语法都顺理成章。 一、锚定起点:节点匹配的三种粒度 最粗的粒度是按标签匹配,返回该标签全部节点;最细是按标签加属性精确定位;

2.2 MATCH 起步:从单个节点到子图

本节摘要:MATCH 是 Cypher 的"出发点"。本节从锚定单个节点讲起,逐步加入属性匹配、关系方向与类型、多重标签,最后用 WHERE 精细筛选、用 RETURN 取回结果,完成 Cypher 读查询的最小闭环。每个语法点都配可运行查询与预期输出,全部基于第 1 章装好的 Movie 沙盘。

上一节把地图画好,本节开始行走。MATCH 的心智模型一句话:你描述一个子图的形状,引擎去图里找所有长得像它的实例。这不是循环遍历,而是"模式匹配"——理解了这一点,后面所有语法都顺理成章。

一、锚定起点:节点匹配的三种粒度

最粗的粒度是按标签匹配,返回该标签全部节点;最细是按标签加属性精确定位;中间态用 WHERE:

// 粒度一:全标签扫描(图小时无所谓,大图慎用) MATCH (m:Movie) RETURN count(m)
count(m) -------- 38
// 粒度二:标签 + 属性精确定位——最常见的锚点方式 MATCH (p:Person {name: 'Tom Hanks'}) RETURN p.born
p.born ------ 1956

属性匹配可以放在模式里,也可以放到 WHERE 里,两者在简单等值场景等价;但放模式里的等值匹配是优化器建索引Seek 的信号,2.4 节会看到执行计划层面的差别。因此约定:能用模式内属性锚定的,就别挪到 WHERE

图:模式与实例——形状如何从图里"长"出来

图:模式与实例——形状如何从图里"长"出来

二、迈出第一步:关系方向与类型

从锚点出发,用箭头描述要走的关系。方向用 -> 声明,类型用 [:TYPE] 过滤,二者都可以放宽:

// 定向 + 定类型:他执导的电影 MATCH (p:Person {name: 'Tom Hanks'})-[:DIRECTED]->(m:Movie) RETURN m.title
m.title ------- "That Thing You Do!"
// 放宽方向:只关心"有没有关系",不关心谁指向谁 MATCH (p:Person {name: 'Tom Hanks'})-[:ACTED_IN]-(m:Movie) RETURN DISTINCT m.title LIMIT 3

什么时候必须写死方向?当关系的语义天然单向(如 IN_CATEGORY)而反向边不存在时,写双向会查到意料之外的结果或白白多扫一半。什么时候可以放宽?关系类型多、方向约定不统一的历史数据区,先双向探查再收紧。

三、子图形状:逗号与多段模式

一个 MATCH 里用逗号连接多个模式,匹配的是同时成立的形状——这就是"查子图"的能力来源。经典的共同出演问题:

// 子图:两位演员参演了同一部电影 MATCH (a:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(m:Movie) <-[:ACTED_IN]-(b:Person) WHERE a <> b RETURN m.title, collect(b.name) AS 同片演员
m.title | 同片演员 -----------------|------------------ "The Matrix" | ["Carrie-Anne Moss", "Hugo Weaving", ...] "Speed" | ["Sandra Bullock"]

箭头先出后进,围出"同片"这个三角形结构。用逗号连接多个独立模式时要注意笛卡尔积风险——两个模式若无共享变量,结果行数是两者行数的乘积,大图上很容易爆炸。

四、边走边筛:WHERE 的常用武器

WHERE 在模式匹配之后收窄结果,常用谓词有等值、范围、集合、存在性四类:

// 范围 + 正则:1950 年后出生、名字以 K 开头的演员 MATCH (p:Person) WHERE p.born >= 1950 AND p.name STARTS WITH 'K' RETURN p.name, p.born ORDER BY p.born LIMIT 3
p.name | p.born ----------------|------- "Keanu Reeves" | 1964 "Kate Beckinsale"| 1973
// 存在性:用模式当谓词——"演过黑客帝国的演员" MATCH (p:Person) WHERE EXISTS { MATCH (p)-[:ACTED_IN]->(:Movie {title: 'The Matrix'}) } RETURN p.name

EXISTS 子查询里嵌模式,是"筛节点"与"看邻居"两件事的组合——这种谓词写法比老式的 WHERE (p)-[:ACTED_IN]->() 更清晰,也是 5.x 推荐的口径。

五、收拢答案:RETURN 的取法

RETURN 决定取回什么与怎么取:列别名、去重、排序、限量、以及把多行收成一个值:

// 聚合 + 排序 + 限量:参演人数最多的三部电影 MATCH (:Person)-[:ACTED_IN]->(m:Movie) RETURN m.title, count(*) AS castSize ORDER BY castSize DESC LIMIT 3
m.title | castSize ---------------------|--------- "The Matrix" | 4 "A Few Good Men" | 3 "Jerry Maguire" | 3

💡 ORDER BY 只能排 RETURN(或 WITH)里已存在的值;想按没返回的列排序,把它一起写进 RETURN 或先经 WITH 传递。

本节要点回顾

  • MATCH 的本质是模式匹配:描述形状,引擎找实例;
  • 锚点优先用"标签 + 模式内属性等值",为索引 Seek 留路;
  • 方向能定就定,语义天然单向的关系尤其如此;
  • 逗号连接的多个模式是"同时成立",警惕无共享变量的笛卡尔积;
  • WHERE 的四类谓词:等值、范围、集合、存在性;
  • RETURN 负责去重、排序、限量与聚合收拢。

一程一程地走,模式会越来越长。下一节处理"深度不固定"的问题:变长路径。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U