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 集合条件

最佳实践:

  1. 使用索引加速过滤
  2. 使用参数化查询
  3. 合理组合条件
  4. 注意NULL处理
  5. 使用PROFILE分析性能

下一步,让我们学习聚合函数!

最后更新:2026-03-27