WHERE条件 #
一、WHERE子句概述 #
1.1 基本语法 #
cypher
MATCH (pattern)
WHERE conditions
RETURN expressions
1.2 WHERE特点 #
text
WHERE特点:
├── 用于过滤查询结果
├── 支持多种条件表达式
├── 支持逻辑运算符
├── 支持字符串匹配
└── 支持正则表达式
二、基本条件 #
2.1 比较运算符 #
cypher
MATCH (p:Person)
WHERE p.age = 30
RETURN p
MATCH (p:Person)
WHERE p.age <> 30
RETURN p
MATCH (p:Person)
WHERE p.age > 25
RETURN p
MATCH (p:Person)
WHERE p.age >= 25
RETURN p
MATCH (p:Person)
WHERE p.age < 30
RETURN p
MATCH (p:Person)
WHERE p.age <= 30
RETURN p
2.2 字符串比较 #
cypher
MATCH (p:Person)
WHERE p.name = 'Tom'
RETURN p
MATCH (p:Person)
WHERE p.name <> 'Tom'
RETURN p
2.3 布尔比较 #
cypher
MATCH (p:Person)
WHERE p.isActive = true
RETURN p
MATCH (p:Person)
WHERE p.isActive = false
RETURN p
三、逻辑运算符 #
3.1 AND运算 #
cypher
MATCH (p:Person)
WHERE p.age > 25 AND p.city = 'New York'
RETURN p
3.2 OR运算 #
cypher
MATCH (p:Person)
WHERE p.age > 30 OR p.city = 'New York'
RETURN p
3.3 NOT运算 #
cypher
MATCH (p:Person)
WHERE NOT p.name = 'Tom'
RETURN p
MATCH (p:Person)
WHERE NOT (p.age > 30)
RETURN p
3.4 XOR运算 #
cypher
MATCH (p:Person)
WHERE p.isActive XOR p.isVerified
RETURN p
3.5 复合逻辑 #
cypher
MATCH (p:Person)
WHERE (p.age > 25 AND p.city = 'New York') OR p.name = 'Tom'
RETURN p
四、IN条件 #
4.1 基本IN #
cypher
MATCH (p:Person)
WHERE p.name IN ['Tom', 'Jerry', 'Mike']
RETURN p
4.2 NOT IN #
cypher
MATCH (p:Person)
WHERE NOT p.name IN ['Tom', 'Jerry']
RETURN p
4.3 使用参数 #
cypher
:param names => ['Tom', 'Jerry', 'Mike']
MATCH (p:Person)
WHERE p.name IN $names
RETURN p
4.4 子查询IN #
cypher
MATCH (p:Person)
WHERE p.id IN [1, 2, 3, 4, 5]
RETURN p
五、字符串匹配 #
5.1 STARTS WITH #
cypher
MATCH (p:Person)
WHERE p.name STARTS WITH 'T'
RETURN p
5.2 ENDS WITH #
cypher
MATCH (p:Person)
WHERE p.name ENDS WITH 'm'
RETURN p
5.3 CONTAINS #
cypher
MATCH (p:Person)
WHERE p.name CONTAINS 'om'
RETURN p
5.4 组合字符串条件 #
cypher
MATCH (p:Person)
WHERE p.name STARTS WITH 'T' AND p.name ENDS WITH 'm'
RETURN p
5.5 大小写敏感 #
cypher
MATCH (p:Person)
WHERE toLower(p.name) STARTS WITH 't'
RETURN p
六、正则表达式 #
6.1 基本正则 #
cypher
MATCH (p:Person)
WHERE p.name =~ 'T.*'
RETURN p
6.2 大小写不敏感 #
cypher
MATCH (p:Person)
WHERE p.name =~ '(?i)t.*'
RETURN p
6.3 精确匹配 #
cypher
MATCH (p:Person)
WHERE p.name =~ '^Tom$'
RETURN p
6.4 数字匹配 #
cypher
MATCH (p:Person)
WHERE p.phone =~ '^[0-9]{10}$'
RETURN p
6.5 邮箱匹配 #
cypher
MATCH (p:Person)
WHERE p.email =~ '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
RETURN p
6.6 复杂正则 #
cypher
MATCH (p:Person)
WHERE p.name =~ '^[A-Z][a-z]+$'
RETURN p
七、NULL处理 #
7.1 IS NULL #
cypher
MATCH (p:Person)
WHERE p.email IS NULL
RETURN p
7.2 IS NOT NULL #
cypher
MATCH (p:Person)
WHERE p.email IS NOT NULL
RETURN p
7.3 NULL与比较 #
cypher
MATCH (p:Person)
WHERE p.age IS NOT NULL AND p.age > 25
RETURN p
7.4 coalesce处理NULL #
cypher
MATCH (p:Person)
WHERE coalesce(p.status, 'active') = 'active'
RETURN p
八、范围条件 #
8.1 数值范围 #
cypher
MATCH (p:Person)
WHERE p.age >= 20 AND p.age <= 30
RETURN p
8.2 日期范围 #
cypher
MATCH (e:Event)
WHERE e.date >= date('2024-01-01') AND e.date <= date('2024-12-31')
RETURN e
8.3 时间范围 #
cypher
MATCH (e:Event)
WHERE e.createdAt >= datetime() - duration('P7D')
RETURN e
8.4 使用between #
Cypher没有BETWEEN关键字,使用AND实现:
cypher
MATCH (p:Person)
WHERE p.age >= 20 AND p.age <= 30
RETURN p
九、存在性检查 #
9.1 exists函数 #
cypher
MATCH (p:Person)
WHERE exists(p.email)
RETURN p
9.2 检查关系存在 #
cypher
MATCH (p:Person)
WHERE exists((p)-[:KNOWS]->())
RETURN p
9.3 检查特定关系 #
cypher
MATCH (p:Person)
WHERE exists((p)-[:KNOWS]->(:Person))
RETURN p
9.4 检查模式存在 #
cypher
MATCH (p:Person)
WHERE exists((p)-[:KNOWS]->(:Person {name: 'Tom'}))
RETURN p
十、集合条件 #
10.1 检查列表元素 #
cypher
MATCH (p:Person)
WHERE 'developer' IN p.tags
RETURN p
10.2 检查列表大小 #
cypher
MATCH (p:Person)
WHERE size(p.tags) > 2
RETURN p
10.3 空列表检查 #
cypher
MATCH (p:Person)
WHERE p.tags = []
RETURN p
MATCH (p:Person)
WHERE size(p.tags) = 0
RETURN p
10.4 ALL条件 #
cypher
MATCH (p:Person)
WHERE ALL(tag IN p.tags WHERE tag STARTS WITH 'dev')
RETURN p
10.5 ANY条件 #
cypher
MATCH (p:Person)
WHERE ANY(tag IN p.tags WHERE tag = 'developer')
RETURN p
10.6 NONE条件 #
cypher
MATCH (p:Person)
WHERE NONE(tag IN p.tags WHERE tag = 'inactive')
RETURN p
10.7 SINGLE条件 #
cypher
MATCH (p:Person)
WHERE SINGLE(tag IN p.tags WHERE tag = 'admin')
RETURN p
十一、关系条件 #
11.1 检查关系存在 #
cypher
MATCH (p:Person)
WHERE (p)-[:KNOWS]->()
RETURN p
11.2 检查特定关系 #
cypher
MATCH (p:Person)
WHERE (p)-[:KNOWS]->(:Person {name: 'Tom'})
RETURN p
11.3 检查关系属性 #
cypher
MATCH (p:Person)-[r:KNOWS]->()
WHERE r.since > 2020
RETURN p
11.4 检查关系数量 #
cypher
MATCH (p:Person)
WHERE size((p)-[:KNOWS]->()) > 5
RETURN p
11.5 检查入度 #
cypher
MATCH (p:Person)
WHERE size((p)<-[:KNOWS]-()) > 10
RETURN p
十二、标签条件 #
12.1 检查标签存在 #
cypher
MATCH (n)
WHERE 'Person' IN labels(n)
RETURN n
12.2 多标签检查 #
cypher
MATCH (n)
WHERE ALL(label IN ['Person', 'Actor'] WHERE label IN labels(n))
RETURN n
12.3 任意标签检查 #
cypher
MATCH (n)
WHERE ANY(label IN ['Person', 'Actor'] WHERE label IN labels(n))
RETURN n
十三、CASE表达式 #
13.1 简单CASE #
cypher
MATCH (p:Person)
WHERE
CASE p.status
WHEN 'active' THEN true
WHEN 'pending' THEN true
ELSE false
END = true
RETURN p
13.2 搜索CASE #
cypher
MATCH (p:Person)
WHERE
CASE
WHEN p.age < 18 THEN false
WHEN p.age >= 18 AND p.status = 'active' THEN true
ELSE false
END = true
RETURN p
十四、WITH中的WHERE #
14.1 过滤中间结果 #
cypher
MATCH (p:Person)
WITH p, p.age * 2 AS doubleAge
WHERE doubleAge > 50
RETURN p.name, doubleAge
14.2 聚合后过滤 #
cypher
MATCH (p:Person)-[:KNOWS]->(f:Person)
WITH p, count(f) AS friendCount
WHERE friendCount > 5
RETURN p.name, friendCount
十五、性能优化 #
15.1 使用索引 #
cypher
CREATE INDEX FOR (p:Person) ON (p.name)
MATCH (p:Person)
WHERE p.name = 'Tom'
RETURN p
15.2 避免全图扫描 #
cypher
MATCH (p:Person {name: 'Tom'})-[:KNOWS]->(f:Person)
RETURN f
15.3 使用参数 #
cypher
:param name => 'Tom'
MATCH (p:Person)
WHERE p.name = $name
RETURN p
15.4 性能建议 #
text
建议:
├── 为常用过滤属性创建索引
├── 使用参数化查询
├── 避免复杂的正则表达式
├── 合理使用索引
└── 使用PROFILE分析查询
十六、实际应用示例 #
16.1 用户搜索 #
cypher
MATCH (u:User)
WHERE u.name CONTAINS $keyword
OR u.email CONTAINS $keyword
RETURN u
ORDER BY u.name
LIMIT 20
16.2 活跃用户查询 #
cypher
MATCH (u:User)
WHERE u.isActive = true
AND u.lastLogin > datetime() - duration('P30D')
AND exists(u.email)
RETURN u
16.3 高级筛选 #
cypher
MATCH (p:Person)
WHERE p.age >= $minAge
AND p.age <= $maxAge
AND p.city IN $cities
AND p.status = 'active'
AND exists((p)-[:KNOWS]->())
RETURN p
16.4 复杂条件查询 #
cypher
MATCH (p:Person)
WHERE (p.name =~ '^[A-Z]' AND p.age > 25)
OR (p.city = 'New York' AND p.status = 'active')
OR ('admin' IN p.roles)
RETURN p
十七、总结 #
WHERE条件要点:
| 条件类型 | 语法 | 说明 |
|---|---|---|
| 比较 | =, <>, <, >, <=, >= | 值比较 |
| 逻辑 | AND, OR, NOT, XOR | 逻辑运算 |
| IN | value IN list | 列表包含 |
| 字符串 | STARTS WITH, ENDS WITH, CONTAINS | 字符串匹配 |
| 正则 | =~ ‘pattern’ | 正则匹配 |
| NULL | IS NULL, IS NOT NULL | NULL判断 |
| 集合 | ALL, ANY, NONE, SINGLE | 集合条件 |
最佳实践:
- 使用索引加速过滤
- 使用参数化查询
- 合理组合条件
- 注意NULL处理
- 使用PROFILE分析性能
下一步,让我们学习聚合函数!
最后更新:2026-03-27