Cypher语法基础 #
一、Cypher概述 #
1.1 什么是Cypher #
Cypher是Neo4j的声明式图查询语言,专注于图的模式匹配。它的设计理念是让查询语句易于阅读和编写。
1.2 Cypher特点 #
text
Cypher特点:
├── 声明式语法:描述"要什么"而非"怎么做"
├── 模式匹配:直观表达图结构
├── ASCII艺术:用图形符号表示节点和关系
└── SQL类似:熟悉SQL的开发者容易上手
二、基本语法结构 #
2.1 语句类型 #
| 语句 | 用途 | 示例 |
|---|---|---|
| MATCH | 模式匹配查询 | MATCH (n) RETURN n |
| CREATE | 创建节点和关系 | CREATE (n:Person) |
| MERGE | 存在则匹配,不存在则创建 | MERGE (n:Person {id: 1}) |
| DELETE | 删除节点和关系 | DELETE n |
| SET | 更新属性和标签 | SET n.name = 'Tom' |
| RETURN | 返回结果 | RETURN n.name |
| WHERE | 条件过滤 | WHERE n.age > 18 |
| WITH | 中间处理管道 | WITH n ORDER BY n.name |
2.2 子句顺序 #
text
标准查询顺序:
├── MATCH / MERGE
├── OPTIONAL MATCH
├── WHERE
├── WITH
├── ORDER BY
├── SKIP / LIMIT
└── RETURN
三、节点语法 #
3.1 节点基本表示 #
cypher
()
(:Label)
(:Label {property: value})
(variable:Label {property: value})
3.2 节点示例 #
cypher
MATCH ()
RETURN ()
MATCH (:Person)
RETURN *
MATCH (p:Person)
RETURN p
MATCH (p:Person {name: 'Tom'})
RETURN p
3.3 多标签节点 #
cypher
CREATE (n:Person:Actor:Director {name: 'Tom'})
四、关系语法 #
4.1 关系基本表示 #
cypher
--
-->
<--
-[]->
-[:TYPE]->
-[:TYPE {property: value}]->
-[r:TYPE]->
-[r:TYPE*1..3]->
4.2 关系示例 #
cypher
MATCH ()-->()
RETURN *
MATCH ()-[:KNOWS]-()
RETURN *
MATCH ()-[:KNOWS]->()
RETURN *
MATCH ()<-[:KNOWS]-()
RETURN *
MATCH (a)-[r:KNOWS]->(b)
RETURN a, r, b
MATCH (a)-[r:KNOWS {since: 2020}]->(b)
RETURN a, r, b
4.3 无向关系 #
cypher
MATCH (a)-[:KNOWS]-(b)
RETURN a, b
五、模式语法 #
5.1 简单模式 #
cypher
MATCH (p:Person)-[:KNOWS]->(f:Person)
RETURN p, f
5.2 链式模式 #
cypher
MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(c)
RETURN a, b, c
5.3 复杂模式 #
cypher
MATCH (a)-[:KNOWS]->(b)-[:WORKS_AT]->(c:Company)<-[:WORKS_AT]-(d:Person)
RETURN a, b, c, d
5.4 路径变量 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN p
六、变量与命名 #
6.1 变量命名规则 #
text
命名规则:
├── 以字母开头
├── 可包含字母、数字、下划线
├── 区分大小写
└── 不能使用保留字
6.2 有效变量名 #
cypher
MATCH (person:Person)
MATCH (p1:Person)
MATCH (person_name:Person)
MATCH (Person:Person)
6.3 无效变量名 #
cypher
MATCH (1person:Person)
MATCH (my-var:Person)
MATCH (match:Person)
6.4 使用反引号 #
cypher
MATCH (`1person`:Person)
MATCH (`my-var`:Person)
MATCH (`MATCH`:Person)
七、注释 #
7.1 单行注释 #
cypher
MATCH (n:Person)
WHERE n.age > 18
RETURN n
7.2 多行注释 #
cypher
MATCH (n:Person)
WHERE n.age > 18
RETURN n
7.3 行内注释 #
cypher
MATCH (n:Person) -- 查找所有Person节点
WHERE n.age > 18 -- 筛选成年人
RETURN n -- 返回结果
八、操作符 #
8.1 比较操作符 #
| 操作符 | 说明 | 示例 |
|---|---|---|
| = | 等于 | n.name = 'Tom' |
| <> | 不等于 | n.name <> 'Tom' |
| < | 小于 | n.age < 30 |
| > | 大于 | n.age > 18 |
| <= | 小于等于 | n.age <= 30 |
| >= | 大于等于 | n.age >= 18 |
8.2 逻辑操作符 #
| 操作符 | 说明 | 示例 |
|---|---|---|
| AND | 与 | a AND b |
| OR | 或 | a OR b |
| NOT | 非 | NOT a |
| XOR | 异或 | a XOR b |
8.3 字符串操作符 #
| 操作符 | 说明 | 示例 |
|---|---|---|
| STARTS WITH | 前缀匹配 | n.name STARTS WITH 'T' |
| ENDS WITH | 后缀匹配 | n.name ENDS WITH 'm' |
| CONTAINS | 包含 | n.name CONTAINS 'om' |
| =~ | 正则匹配 | n.name =~ 'T.*' |
| + | 字符串连接 | n.first + ' ' + n.last |
8.4 集合操作符 #
| 操作符 | 说明 | 示例 |
|---|---|---|
| IN | 成员判断 | n.id IN [1, 2, 3] |
| + | 集合连接 | [1, 2] + [3, 4] |
| [] | 索引访问 | list[0] |
8.5 NULL操作符 #
| 操作符 | 说明 | 示例 |
|---|---|---|
| IS NULL | 为空 | n.name IS NULL |
| IS NOT NULL | 不为空 | n.name IS NOT NULL |
| COALESCE | 返回第一个非空值 | COALESCE(n.name, 'Unknown') |
九、属性访问 #
9.1 点语法 #
cypher
MATCH (n:Person)
RETURN n.name, n.age
9.2 括号语法 #
cypher
MATCH (n:Person)
RETURN n['name'], n['age']
9.3 动态属性访问 #
cypher
MATCH (n:Person)
WITH n, 'name' AS prop
RETURN n[prop]
十、CASE表达式 #
10.1 简单CASE #
cypher
MATCH (n:Person)
RETURN
n.name,
CASE n.status
WHEN 'active' THEN '活跃'
WHEN 'inactive' THEN '不活跃'
ELSE '未知'
END AS status_text
10.2 搜索CASE #
cypher
MATCH (n:Person)
RETURN
n.name,
CASE
WHEN n.age < 18 THEN '未成年'
WHEN n.age < 60 THEN '成年'
ELSE '老年'
END AS age_group
十一、WITH子句 #
11.1 基本用法 #
cypher
MATCH (n:Person)
WITH n.name AS name, n.age AS age
WHERE age > 18
RETURN name, age
11.2 聚合后过滤 #
cypher
MATCH (n:Person)-[:KNOWS]->(f:Person)
WITH n, count(f) AS friend_count
WHERE friend_count > 5
RETURN n.name, friend_count
11.3 数据转换 #
cypher
MATCH (n:Person)
WITH n.name AS name
ORDER BY name
LIMIT 10
RETURN collect(name) AS names
十二、UNWIND子句 #
12.1 展开列表 #
cypher
UNWIND [1, 2, 3] AS x
RETURN x
12.2 批量创建 #
cypher
UNWIND ['Tom', 'Jerry', 'Mike'] AS name
CREATE (p:Person {name: name})
12.3 参数展开 #
cypher
:param names => ['Tom', 'Jerry', 'Mike']
UNWIND $names AS name
CREATE (p:Person {name: name})
十三、RETURN子句 #
13.1 基本返回 #
cypher
MATCH (n:Person)
RETURN n
13.2 返回属性 #
cypher
MATCH (n:Person)
RETURN n.name, n.age
13.3 别名 #
cypher
MATCH (n:Person)
RETURN n.name AS name, n.age AS age
13.4 返回表达式 #
cypher
MATCH (n:Person)
RETURN n.name, n.age * 2 AS double_age
13.5 去重 #
cypher
MATCH (n:Person)
RETURN DISTINCT n.name
十四、ORDER BY子句 #
14.1 升序排序 #
cypher
MATCH (n:Person)
RETURN n.name, n.age
ORDER BY n.age ASC
14.2 降序排序 #
cypher
MATCH (n:Person)
RETURN n.name, n.age
ORDER BY n.age DESC
14.3 多字段排序 #
cypher
MATCH (n:Person)
RETURN n.name, n.age
ORDER BY n.age DESC, n.name ASC
14.4 NULL处理 #
cypher
MATCH (n:Person)
RETURN n.name, n.age
ORDER BY n.age ASC NULLS FIRST
MATCH (n:Person)
RETURN n.name, n.age
ORDER BY n.age DESC NULLS LAST
十五、LIMIT和SKIP #
15.1 LIMIT限制数量 #
cypher
MATCH (n:Person)
RETURN n
LIMIT 10
15.2 SKIP跳过 #
cypher
MATCH (n:Person)
RETURN n
SKIP 10
LIMIT 10
15.3 分页查询 #
cypher
MATCH (n:Person)
RETURN n
ORDER BY n.name
SKIP 20
LIMIT 10
十六、参数化查询 #
16.1 使用参数 #
cypher
:param name => 'Tom'
MATCH (n:Person {name: $name})
RETURN n
16.2 多参数 #
cypher
:param minAge => 18
:param maxAge => 60
MATCH (n:Person)
WHERE n.age >= $minAge AND n.age <= $maxAge
RETURN n
16.3 列表参数 #
cypher
:param names => ['Tom', 'Jerry', 'Mike']
MATCH (n:Person)
WHERE n.name IN $names
RETURN n
十七、语句组合 #
17.1 多个MATCH #
cypher
MATCH (a:Person {name: 'Tom'})
MATCH (b:Person {name: 'Jerry'})
CREATE (a)-[:KNOWS]->(b)
17.2 UNION合并结果 #
cypher
MATCH (n:Person)
RETURN n.name AS name
UNION
MATCH (n:Company)
RETURN n.name AS name
17.3 UNION ALL(保留重复) #
cypher
MATCH (n:Person)
RETURN n.name AS name
UNION ALL
MATCH (n:Company)
RETURN n.name AS name
十八、命名规范建议 #
18.1 标签命名 #
text
建议:
├── 使用大驼峰命名:Person, Company, Product
├── 使用名词:User, Order, Item
└── 避免使用动词:Created, Has
18.2 关系类型命名 #
text
建议:
├── 使用大写蛇形命名:KNOWS, WORKS_AT, FRIEND_OF
├── 使用动词或动词短语:ACTED_IN, DIRECTED_BY
└── 方向性明确:PARENT_OF, CHILD_OF
18.3 属性命名 #
text
建议:
├── 使用小驼峰命名:firstName, lastName
├── 或使用小写蛇形命名:first_name, last_name
└── 保持一致性
十九、总结 #
Cypher语法要点:
| 概念 | 语法 | 示例 |
|---|---|---|
| 节点 | () | (n:Person) |
| 关系 | -[]-> | -[:KNOWS]-> |
| 属性 | {} | {name: 'Tom'} |
| 模式 | 组合 | (a)-[:KNOWS]->(b) |
最佳实践:
- 使用有意义的变量名
- 保持命名规范一致
- 使用参数化查询防止注入
- 合理使用WITH进行数据转换
- 添加注释提高可读性
下一步,让我们学习Neo4j的数据类型!
最后更新:2026-03-27