基础查询 #
一、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 |
最佳实践:
- 使用索引加速查询
- 使用LIMIT避免返回过多数据
- 使用OPTIONAL MATCH处理可能不存在的匹配
- 使用PROFILE分析查询性能
- 合理使用WITH进行数据处理
下一步,让我们学习模式匹配!
最后更新:2026-03-27