基础查询 #

一、MATCH语句概述 #

1.1 基本语法 #

cypher
MATCH (pattern)
WHERE conditions
RETURN expressions

1.2 MATCH特点 #

text
MATCH特点:
├── 用于模式匹配查询
├── 支持节点和关系模式
├── 可以与其他子句组合
├── 返回匹配的数据
└── 是Cypher最核心的查询语句

二、查询节点 #

2.1 查询所有节点 #

cypher
MATCH (n)
RETURN n
LIMIT 100

2.2 按标签查询 #

cypher
MATCH (p:Person)
RETURN p

2.3 按多标签查询 #

cypher
MATCH (p:Person:Actor)
RETURN p

2.4 按属性查询 #

cypher
MATCH (p:Person {name: 'Tom'})
RETURN p

2.5 查询节点属性 #

cypher
MATCH (p:Person {name: 'Tom'})
RETURN p.name, p.age, p.email

2.6 查询节点数量 #

cypher
MATCH (p:Person)
RETURN count(p) AS person_count

三、查询关系 #

3.1 查询所有关系 #

cypher
MATCH ()-[r]->()
RETURN r
LIMIT 100

3.2 按关系类型查询 #

cypher
MATCH ()-[r:KNOWS]->()
RETURN r

3.3 查询有关系的节点对 #

cypher
MATCH (a)-[r:KNOWS]->(b)
RETURN a.name, b.name

3.4 查询特定方向的关系 #

cypher
MATCH (a:Person {name: 'Tom'})-[:KNOWS]->(b)
RETURN b

MATCH (a:Person {name: 'Tom'})<-[:KNOWS]-(b)
RETURN b

3.5 忽略方向查询 #

cypher
MATCH (a:Person {name: 'Tom'})-[:KNOWS]-(b)
RETURN b

3.6 查询关系属性 #

cypher
MATCH ()-[r:KNOWS]->()
RETURN r.since, r.level

四、RETURN子句 #

4.1 返回节点 #

cypher
MATCH (p:Person)
RETURN p

4.2 返回属性 #

cypher
MATCH (p:Person)
RETURN p.name, p.age

4.3 使用别名 #

cypher
MATCH (p:Person)
RETURN p.name AS name, p.age AS age

4.4 返回表达式 #

cypher
MATCH (p:Person)
RETURN p.name, p.age * 2 AS double_age

4.5 返回唯一值 #

cypher
MATCH (p:Person)
RETURN DISTINCT p.name

4.6 返回多个值 #

cypher
MATCH (a)-[r]->(b)
RETURN a.name, type(r) AS rel_type, b.name

4.7 返回所有属性 #

cypher
MATCH (p:Person)
RETURN p {.*}

4.8 返回自定义对象 #

cypher
MATCH (p:Person)
RETURN {
    name: p.name,
    age: p.age,
    labels: labels(p)
} AS person_info

五、WHERE子句 #

5.1 基本条件 #

cypher
MATCH (p:Person)
WHERE p.age > 25
RETURN p

5.2 多条件AND #

cypher
MATCH (p:Person)
WHERE p.age > 25 AND p.city = 'New York'
RETURN p

5.3 多条件OR #

cypher
MATCH (p:Person)
WHERE p.age > 30 OR p.city = 'New York'
RETURN p

5.4 IN条件 #

cypher
MATCH (p:Person)
WHERE p.name IN ['Tom', 'Jerry', 'Mike']
RETURN p

5.5 字符串匹配 #

cypher
MATCH (p:Person)
WHERE p.name STARTS WITH 'T'
RETURN p

MATCH (p:Person)
WHERE p.name ENDS WITH 'm'
RETURN p

MATCH (p:Person)
WHERE p.name CONTAINS 'om'
RETURN p

5.6 正则表达式 #

cypher
MATCH (p:Person)
WHERE p.name =~ 'T.*'
RETURN p

5.7 NULL判断 #

cypher
MATCH (p:Person)
WHERE p.email IS NOT NULL
RETURN p

MATCH (p:Person)
WHERE p.email IS NULL
RETURN p

5.8 范围查询 #

cypher
MATCH (p:Person)
WHERE p.age >= 20 AND p.age <= 30
RETURN p

六、ORDER BY子句 #

6.1 升序排序 #

cypher
MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age ASC

6.2 降序排序 #

cypher
MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age DESC

6.3 多字段排序 #

cypher
MATCH (p:Person)
RETURN p.name, p.city, p.age
ORDER BY p.city ASC, p.age DESC

6.4 按表达式排序 #

cypher
MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age DESC, p.name ASC

6.5 NULL值排序 #

cypher
MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age ASC NULLS FIRST

MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age DESC NULLS LAST

七、LIMIT和SKIP #

7.1 LIMIT限制数量 #

cypher
MATCH (p:Person)
RETURN p
LIMIT 10

7.2 SKIP跳过 #

cypher
MATCH (p:Person)
RETURN p
SKIP 10

7.3 分页查询 #

cypher
MATCH (p:Person)
RETURN p
ORDER BY p.name
SKIP 20
LIMIT 10

7.4 计算分页 #

cypher
:param page => 3
:param pageSize => 10
MATCH (p:Person)
RETURN p
ORDER BY p.name
SKIP ($page - 1) * $pageSize
LIMIT $pageSize

八、OPTIONAL MATCH #

8.1 基本用法 #

OPTIONAL MATCH类似于SQL的LEFT JOIN,即使没有匹配也会返回NULL。

cypher
MATCH (p:Person {name: 'Tom'})
OPTIONAL MATCH (p)-[:KNOWS]->(f:Person)
RETURN p.name, f.name

8.2 处理NULL结果 #

cypher
MATCH (p:Person)
OPTIONAL MATCH (p)-[:KNOWS]->(f:Person)
RETURN p.name, coalesce(f.name, 'No friends') AS friend_name

8.3 多个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

九、WITH子句 #

9.1 中间处理 #

cypher
MATCH (p:Person)
WITH p.name AS name, p.age AS age
WHERE age > 25
RETURN name, age

9.2 聚合后过滤 #

cypher
MATCH (p:Person)-[:KNOWS]->(f:Person)
WITH p, count(f) AS friend_count
WHERE friend_count > 5
RETURN p.name, friend_count

9.3 排序后限制 #

cypher
MATCH (p:Person)
WITH p ORDER BY p.age DESC
LIMIT 10
RETURN p.name, p.age

9.4 数据转换 #

cypher
MATCH (p:Person)
WITH p.name AS name
ORDER BY name
RETURN collect(name) AS names

十、查询函数 #

10.1 聚合函数 #

cypher
MATCH (p:Person)
RETURN 
    count(p) AS total,
    avg(p.age) AS avg_age,
    max(p.age) AS max_age,
    min(p.age) AS min_age,
    sum(p.age) AS sum_age

10.2 字符串函数 #

cypher
MATCH (p:Person)
RETURN 
    toUpper(p.name) AS upper_name,
    toLower(p.name) AS lower_name,
    substring(p.name, 0, 3) AS short_name

10.3 类型转换函数 #

cypher
MATCH (p:Person)
RETURN 
    toString(p.age) AS age_str,
    toInteger(p.age) AS age_int

10.4 集合函数 #

cypher
MATCH (p:Person)
RETURN 
    collect(p.name) AS names,
    size(collect(p.name)) AS name_count

10.5 节点函数 #

cypher
MATCH (p:Person)
RETURN 
    id(p) AS node_id,
    labels(p) AS node_labels,
    keys(p) AS property_keys,
    properties(p) AS all_properties

10.6 关系函数 #

cypher
MATCH ()-[r]->()
RETURN 
    id(r) AS rel_id,
    type(r) AS rel_type,
    startNode(r) AS start_node,
    endNode(r) AS end_node

十一、查询性能 #

11.1 使用索引 #

cypher
CREATE INDEX FOR (p:Person) ON (p.name)

MATCH (p:Person)
WHERE p.name = 'Tom'
RETURN p

11.2 使用PROFILE分析 #

cypher
PROFILE MATCH (p:Person)-[:KNOWS]->(f:Person)
WHERE p.name = 'Tom'
RETURN p, f

11.3 使用EXPLAIN查看计划 #

cypher
EXPLAIN MATCH (p:Person)-[:KNOWS]->(f:Person)
WHERE p.name = 'Tom'
RETURN p, f

11.4 性能建议 #

text
建议:
├── 为常用查询属性创建索引
├── 使用PROFILE分析查询
├── 避免全图扫描
├── 合理使用LIMIT
└── 减少返回的数据量

十二、实际应用示例 #

12.1 查询用户信息 #

cypher
MATCH (u:User {id: 'user_001'})
RETURN u {
    .*,
    labels: labels(u)
}

12.2 查询用户的朋友 #

cypher
MATCH (u:User {id: 'user_001'})-[:FRIEND_OF]-(f:User)
RETURN f.name, f.email
ORDER BY f.name

12.3 查询用户的朋友数量 #

cypher
MATCH (u:User {id: 'user_001'})-[:FRIEND_OF]-(f:User)
RETURN count(f) AS friend_count

12.4 查询活跃用户 #

cypher
MATCH (u:User)
WHERE u.isActive = true AND u.lastLogin > datetime() - duration('P30D')
RETURN u.name, u.lastLogin
ORDER BY u.lastLogin DESC
LIMIT 10

12.5 查询用户及其订单 #

cypher
MATCH (u:User {id: 'user_001'})
OPTIONAL MATCH (u)-[:PLACED]->(o:Order)
RETURN u.name, collect(o {.*}) AS orders

十三、总结 #

基础查询要点:

子句 用途 示例
MATCH 模式匹配 MATCH (p:Person)
WHERE 条件过滤 WHERE p.age > 25
RETURN 返回结果 RETURN p.name
ORDER BY 排序 ORDER BY p.age DESC
LIMIT 限制数量 LIMIT 10
SKIP 跳过 SKIP 10
WITH 中间处理 WITH p ORDER BY p.age

最佳实践:

  1. 使用索引加速查询
  2. 使用LIMIT避免返回过多数据
  3. 使用OPTIONAL MATCH处理可能不存在的匹配
  4. 使用PROFILE分析查询性能
  5. 合理使用WITH进行数据处理

下一步,让我们学习模式匹配!

最后更新:2026-03-27