模式匹配 #
一、模式匹配概述 #
1.1 什么是模式匹配 #
模式匹配是Cypher的核心特性,用于在图中查找符合特定结构的数据。
text
模式匹配特点:
├── 声明式语法
├── 直观表达图结构
├── 支持复杂图模式
├── 自动优化查询
└── 类似于图的可视化表示
1.2 模式类型 #
text
模式类型:
├── 节点模式
├── 关系模式
├── 路径模式
├── 变长路径模式
└── 复杂图模式
二、节点模式 #
2.1 空节点模式 #
cypher
MATCH (n)
RETURN n
2.2 带标签的节点模式 #
cypher
MATCH (p:Person)
RETURN p
2.3 带属性的节点模式 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN p
2.4 多标签节点模式 #
cypher
MATCH (p:Person:Actor)
RETURN p
2.5 节点模式组合 #
cypher
MATCH (p:Person), (c:Company)
RETURN p, c
三、关系模式 #
3.1 有向关系模式 #
cypher
MATCH (a)-[:KNOWS]->(b)
RETURN a, b
3.2 反向关系模式 #
cypher
MATCH (a)<-[:KNOWS]-(b)
RETURN a, b
3.3 无向关系模式 #
cypher
MATCH (a)-[:KNOWS]-(b)
RETURN a, b
3.4 带属性的关系模式 #
cypher
MATCH (a)-[:KNOWS {since: 2020}]->(b)
RETURN a, b
3.5 关系变量模式 #
cypher
MATCH (a)-[r:KNOWS]->(b)
RETURN a, r, b
3.6 多种关系类型模式 #
cypher
MATCH (a)-[:KNOWS|FRIEND_OF]->(b)
RETURN a, b
3.7 任意关系类型模式 #
cypher
MATCH (a)-[r]->(b)
RETURN a, type(r) AS rel_type, b
四、链式模式 #
4.1 两跳关系 #
cypher
MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(c)
RETURN a.name, b.name, c.name
4.2 多跳关系 #
cypher
MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(c)-[:KNOWS]->(d)
RETURN a.name, d.name
4.3 混合关系类型 #
cypher
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person)
RETURN p.name, m.title, d.name
4.4 可变跳数 #
cypher
MATCH (a)-[:KNOWS*1..3]->(b)
RETURN a.name, b.name
4.5 任意长度 #
cypher
MATCH (a)-[:KNOWS*]->(b)
RETURN a.name, b.name
五、分支模式 #
5.1 同一节点的多个关系 #
cypher
MATCH (p:Person)-[:KNOWS]->(f:Person),
(p)-[:WORKS_AT]->(c:Company)
RETURN p.name, f.name, c.name
5.2 多个MATCH子句 #
cypher
MATCH (p:Person {name: 'Tom'})
MATCH (p)-[:KNOWS]->(f:Person)
MATCH (p)-[:WORKS_AT]->(c:Company)
RETURN p.name, f.name, c.name
5.3 分支汇聚模式 #
cypher
MATCH (a)-[:KNOWS]->(c)<-[:KNOWS]-(b)
RETURN a.name, b.name, c.name
5.4 共同邻居 #
cypher
MATCH (a:Person {name: 'Tom'})-[:KNOWS]->(common)<-[:KNOWS]-(b:Person {name: 'Jerry'})
RETURN common.name
六、复杂图模式 #
6.1 三角形模式 #
cypher
MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(c)-[:KNOWS]->(a)
RETURN a.name, b.name, c.name
6.2 循环模式 #
cypher
MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(c)-[:KNOWS]->(a)
WHERE a.name = 'Tom'
RETURN a, b, c
6.3 星形模式 #
cypher
MATCH (center:Person {name: 'Tom'})-[:KNOWS]->(leaf:Person)
RETURN center.name, collect(leaf.name) AS friends
6.4 菱形模式 #
cypher
MATCH (a)-[:KNOWS]->(b),
(a)-[:KNOWS]->(c),
(b)-[:KNOWS]->(d),
(c)-[:KNOWS]->(d)
RETURN a.name, b.name, c.name, d.name
6.5 层级模式 #
cypher
MATCH (ceo:Employee)-[:MANAGES]->(manager:Employee)-[:MANAGES]->(worker:Employee)
RETURN ceo.name, manager.name, worker.name
七、路径变量 #
7.1 定义路径变量 #
cypher
MATCH p = (a)-[:KNOWS]->(b)
RETURN p
7.2 路径函数 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN
p AS path,
length(p) AS path_length,
nodes(p) AS path_nodes,
relationships(p) AS path_rels
7.3 路径过滤 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
WHERE length(p) = 2
RETURN p
7.4 路径属性 #
cypher
MATCH p = (a)-[r:KNOWS*1..3]->(b)
RETURN
[rel IN r | rel.since] AS years,
[node IN nodes(p) | node.name] AS names
八、命名模式 #
8.1 使用变量命名 #
cypher
MATCH (tom:Person {name: 'Tom'})-[:KNOWS]->(friend:Person)
RETURN tom, friend
8.2 复用变量 #
cypher
MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(a)
RETURN a.name, b.name
8.3 模式组合 #
cypher
MATCH (a:Person {name: 'Tom'})-[:KNOWS]->(b:Person),
(b)-[:WORKS_AT]->(c:Company)
RETURN a.name, b.name, c.name
九、OPTIONAL模式 #
9.1 OPTIONAL MATCH #
cypher
MATCH (p:Person {name: 'Tom'})
OPTIONAL MATCH (p)-[:KNOWS]->(f:Person)
RETURN p.name, f.name
9.2 多个OPTIONAL MATCH #
cypher
MATCH (p:Person {name: 'Tom'})
OPTIONAL MATCH (p)-[:KNOWS]->(friend:Person)
OPTIONAL MATCH (p)-[:WORKS_AT]->(company:Company)
RETURN p.name, friend.name, company.name
9.3 处理NULL结果 #
cypher
MATCH (p:Person)
OPTIONAL MATCH (p)-[:KNOWS]->(f:Person)
WITH p, count(f) AS friend_count
RETURN p.name, friend_count
十、模式匹配技巧 #
10.1 避免笛卡尔积 #
cypher
MATCH (p:Person {name: 'Tom'})
MATCH (p)-[:KNOWS]->(f:Person)
MATCH (p)-[:WORKS_AT]->(c:Company)
RETURN p, f, c
10.2 使用索引优化 #
cypher
CREATE INDEX FOR (p:Person) ON (p.name)
MATCH (p:Person {name: 'Tom'})-[:KNOWS]->(f:Person)
RETURN p, f
10.3 限制搜索深度 #
cypher
MATCH (a)-[:KNOWS*1..3]->(b)
RETURN a, b
10.4 使用WHERE过滤 #
cypher
MATCH (a)-[r:KNOWS*1..3]->(b)
WHERE ALL(x IN r WHERE x.since > 2020)
RETURN a, b
十一、模式匹配函数 #
11.1 ALL函数 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
WHERE ALL(x IN nodes(p) WHERE x.age > 20)
RETURN p
11.2 ANY函数 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
WHERE ANY(x IN nodes(p) WHERE x.name = 'Tom')
RETURN p
11.3 NONE函数 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
WHERE NONE(x IN nodes(p) WHERE x.status = 'inactive')
RETURN p
11.4 SINGLE函数 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
WHERE SINGLE(x IN nodes(p) WHERE x.name = 'Tom')
RETURN p
十二、实际应用示例 #
12.1 查找朋友的朋友 #
cypher
MATCH (me:Person {name: 'Tom'})-[:KNOWS]->(friend)-[:KNOWS]->(fof:Person)
WHERE NOT (me)-[:KNOWS]->(fof) AND me <> fof
RETURN fof.name, count(friend) AS mutual_friends
ORDER BY mutual_friends DESC
12.2 查找共同好友 #
cypher
MATCH (a:Person {name: 'Tom'})-[:KNOWS]->(common)<-[:KNOWS]-(b:Person {name: 'Jerry'})
RETURN common.name
12.3 查找最短路径 #
cypher
MATCH p = shortestPath((a:Person {name: 'Tom'})-[:KNOWS*]-(b:Person {name: 'Jerry'}))
RETURN p
12.4 查找影响力路径 #
cypher
MATCH path = (a:Person {name: 'Tom'})-[:INFLUENCES*1..5]->(b:Person)
RETURN path
ORDER BY length(path)
LIMIT 10
12.5 查找组织层级 #
cypher
MATCH path = (ceo:Employee {title: 'CEO'})-[:MANAGES*]->(employee:Employee)
RETURN
employee.name,
length(path) AS level,
[n IN nodes(path) | n.name] AS hierarchy
ORDER BY level
十三、总结 #
模式匹配要点:
| 模式类型 | 语法 | 说明 |
|---|---|---|
| 节点模式 | (n:Label {prop: value}) | 匹配节点 |
| 关系模式 | -[:TYPE]-> | 匹配关系 |
| 链式模式 | (a)-[]->(b)-[]->© | 匹配链式结构 |
| 变长模式 | -[:TYPE*1…3]-> | 匹配变长路径 |
| 路径变量 | p = (a)-[]->(b) | 捕获完整路径 |
最佳实践:
- 使用有意义的变量名
- 合理使用索引
- 限制搜索深度
- 使用OPTIONAL处理可能不存在的匹配
- 使用路径变量捕获复杂结构
下一步,让我们学习WHERE条件!
最后更新:2026-03-27