模式匹配 #

一、模式匹配概述 #

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) 捕获完整路径

最佳实践:

  1. 使用有意义的变量名
  2. 合理使用索引
  3. 限制搜索深度
  4. 使用OPTIONAL处理可能不存在的匹配
  5. 使用路径变量捕获复杂结构

下一步,让我们学习WHERE条件!

最后更新:2026-03-27