Appearance
Cypher 语法参考
完整语法速查
1. 基本语法结构
cypher
// 匹配模式
MATCH (node:Label {property: value})
// 创建节点
CREATE (node:Label {property: value})
// 创建关系
MATCH (a:Label1), (b:Label2)
CREATE (a)-[r:RELATIONSHIP_TYPE {property: value}]->(b)
// 更新属性
MATCH (node:Label {property: value})
SET node.new_property = new_value
// 删除节点
MATCH (node:Label {property: value})
DELETE node
// 删除关系
MATCH (a:Label1)-[r:RELATIONSHIP_TYPE]->(b:Label2)
DELETE r
// 返回结果
MATCH (node:Label)
RETURN node.property
// 过滤条件
MATCH (node:Label)
WHERE node.property > value
RETURN node
// 排序
MATCH (node:Label)
RETURN node.property
ORDER BY node.property DESC
// 限制结果
MATCH (node:Label)
RETURN node.property
LIMIT 10
// 跳过结果
MATCH (node:Label)
RETURN node.property
SKIP 5
// 聚合函数
MATCH (node:Label)
RETURN COUNT(node), AVG(node.property)
// 分组
MATCH (node:Label)
RETURN node.group, COUNT(node)
GROUP BY node.group
// 路径查询
MATCH path = (a:Label1)-[*1..3]->(b:Label2)
RETURN path
// 最短路径
MATCH (a:Label1), (b:Label2)
CALL gds.shortestPath.dijkstra.stream({startNode: a, endNode: b})
YIELD path
RETURN path2. 模式语法
| 语法 | 描述 | 示例 |
|---|---|---|
(n) | 节点 | (person) |
(n:Label) | 带标签的节点 | (person:Person) |
(n {key: value}) | 带属性的节点 | (person {name: 'John'}) |
(n:Label {key: value}) | 带标签和属性的节点 | (person:Person {name: 'John'}) |
(a)-[r]->(b) | 关系 | (person)-[friendship]->(friend) |
(a)-[r:TYPE]->(b) | 带类型的关系 | (person)-[friendship:FRIENDS_WITH]->(friend) |
(a)-[r:TYPE {key: value}]->(b) | 带类型和属性的关系 | (person)-[friendship:FRIENDS_WITH {since: 2010}]->(friend) |
(a)-[r*1..3]->(b) | 可变长度关系 | (person)-[friendship:FRIENDS_WITH*1..3]->(friend) |
3. 子句
| 子句 | 描述 | 示例 |
|---|---|---|
MATCH | 匹配模式 | MATCH (person:Person) |
CREATE | 创建节点和关系 | CREATE (person:Person {name: 'John'}) |
MERGE | 创建或匹配节点和关系 | MERGE (person:Person {name: 'John'}) |
SET | 设置属性 | SET person.age = 30 |
REMOVE | 移除属性或标签 | REMOVE person.age |
DELETE | 删除节点和关系 | DELETE person |
WHERE | 过滤条件 | WHERE person.age > 25 |
RETURN | 返回结果 | RETURN person.name |
WITH | 传递中间结果 | WITH person.name AS name |
ORDER BY | 排序结果 | ORDER BY person.age DESC |
LIMIT | 限制结果数量 | LIMIT 10 |
SKIP | 跳过结果数量 | SKIP 5 |
DISTINCT | 去重结果 | RETURN DISTINCT person.name |
UNWIND | 展开列表 | UNWIND $list AS item |
FOREACH | 遍历列表 | `FOREACH (item IN $list |
CALL | 调用过程 | CALL db.stats() |
常用函数列表
1. 标量函数
| 函数 | 描述 | 示例 |
|---|---|---|
coalesce() | 返回第一个非 null 值 | coalesce(person.name, 'Unknown') |
case | 条件表达式 | CASE WHEN person.age < 18 THEN 'Minor' ELSE 'Adult' END |
size() | 返回集合或字符串的大小 | size(person.friends) |
str() | 转换为字符串 | str(person.age) |
toInteger() | 转换为整数 | toInteger(person.age) |
toFloat() | 转换为浮点数 | toFloat(person.age) |
toBoolean() | 转换为布尔值 | toBoolean(person.active) |
datetime() | 返回当前日期时间 | datetime() |
date() | 返回当前日期 | date() |
time() | 返回当前时间 | time() |
duration() | 创建时间段 | duration('P1Y2M3D') |
rand() | 返回随机数 | rand() |
round() | 四舍五入 | round(person.age) |
floor() | 向下取整 | floor(person.age) |
ceil() | 向上取整 | ceil(person.age) |
abs() | 绝对值 | abs(person.score) |
sqrt() | 平方根 | sqrt(person.score) |
log() | 自然对数 | log(person.score) |
exp() | 指数函数 | exp(person.score) |
sin() | 正弦函数 | sin(radians(person.angle)) |
cos() | 余弦函数 | cos(radians(person.angle)) |
tan() | 正切函数 | tan(radians(person.angle)) |
radians() | 角度转弧度 | radians(person.angle) |
degrees() | 弧度转角度 | degrees(radians(person.angle)) |
2. 列表函数
| 函数 | 描述 | 示例 |
|---|---|---|
range() | 创建整数范围 | range(1, 10) |
collect() | 收集为列表 | collect(person.name) |
filter() | 过滤列表 | filter(x IN person.friends WHERE x.age > 25) |
map() | 映射列表 | `map(x IN person.friends |
reduce() | 归约列表 | `reduce(sum = 0, x IN person.scores |
extract() | 提取列表元素 | `extract(x IN person.friends |
exists() | 检查列表是否包含元素 | exists(person.friends WHERE x.name = 'John') |
all() | 检查所有元素是否满足条件 | all(x IN person.friends WHERE x.age > 18) |
any() | 检查是否有元素满足条件 | any(x IN person.friends WHERE x.age > 30) |
none() | 检查没有元素满足条件 | none(x IN person.friends WHERE x.age < 18) |
3. 字符串函数
| 函数 | 描述 | 示例 |
|---|---|---|
trim() | 去除首尾空格 | trim(person.name) |
ltrim() | 去除左侧空格 | ltrim(person.name) |
rtrim() | 去除右侧空格 | rtrim(person.name) |
lower() | 转换为小写 | lower(person.name) |
upper() | 转换为大写 | upper(person.name) |
left() | 左侧子字符串 | left(person.name, 3) |
right() | 右侧子字符串 | right(person.name, 3) |
substring() | 子字符串 | substring(person.name, 1, 3) |
replace() | 替换字符串 | replace(person.name, 'John', 'Johnny') |
split() | 分割字符串 | split(person.name, ' ') |
join() | 连接字符串 | join(person.names, ', ') |
startsWith() | 检查是否以字符串开头 | startsWith(person.name, 'J') |
endsWith() | 检查是否以字符串结尾 | endsWith(person.name, 'n') |
contains() | 检查是否包含字符串 | contains(person.name, 'oh') |
4. 聚合函数
| 函数 | 描述 | 示例 |
|---|---|---|
COUNT() | 计数 | COUNT(person) |
SUM() | 求和 | SUM(person.age) |
AVG() | 平均值 | AVG(person.age) |
MIN() | 最小值 | MIN(person.age) |
MAX() | 最大值 | MAX(person.age) |
PERCENTILE() | 百分位数 | PERCENTILE(person.age, 0.5) |
STDEV() | 标准差 | STDEV(person.age) |
VARIANCE() | 方差 | VARIANCE(person.age) |
COLLECT() | 收集为列表 | COLLECT(person.name) |
DISTINCT | 去重 | COUNT(DISTINCT person.name) |
5. 图函数
| 函数 | 描述 | 示例 |
|---|---|---|
id() | 返回节点或关系的 ID | id(person) |
labels() | 返回节点的标签 | labels(person) |
type() | 返回关系的类型 | type(relationship) |
properties() | 返回节点或关系的属性 | properties(person) |
startNode() | 返回关系的起始节点 | startNode(relationship) |
endNode() | 返回关系的结束节点 | endNode(relationship) |
length() | 返回路径的长度 | length(path) |
nodes() | 返回路径的节点 | nodes(path) |
relationships() | 返回路径的关系 | relationships(path) |
操作符说明
1. 比较操作符
| 操作符 | 描述 | 示例 |
|---|---|---|
= | 等于 | person.age = 30 |
<> | 不等于 | person.age <> 30 |
< | 小于 | person.age < 30 |
> | 大于 | person.age > 30 |
<= | 小于等于 | person.age <= 30 |
>= | 大于等于 | person.age >= 30 |
IS NULL | 为空 | person.email IS NULL |
IS NOT NULL | 不为空 | person.email IS NOT NULL |
IN | 在集合中 | person.age IN [25, 30, 35] |
NOT IN | 不在集合中 | person.age NOT IN [25, 30, 35] |
STARTS WITH | 以字符串开头 | person.name STARTS WITH 'J' |
ENDS WITH | 以字符串结尾 | person.name ENDS WITH 'n' |
CONTAINS | 包含字符串 | person.name CONTAINS 'oh' |
2. 逻辑操作符
| 操作符 | 描述 | 示例 |
|---|---|---|
AND | 逻辑与 | person.age > 25 AND person.name = 'John' |
OR | 逻辑或 | person.age > 25 OR person.name = 'John' |
NOT | 逻辑非 | NOT person.age > 25 |
XOR | 逻辑异或 | person.age > 25 XOR person.name = 'John' |
3. 数学操作符
| 操作符 | 描述 | 示例 |
|---|---|---|
+ | 加法 | person.age + 5 |
- | 减法 | person.age - 5 |
* | 乘法 | person.age * 2 |
/ | 除法 | person.age / 2 |
% | 取模 | person.age % 2 |
^ | 幂运算 | person.age ^ 2 |
4. 列表操作符
| 操作符 | 描述 | 示例 |
|---|---|---|
+ | 列表连接 | [1, 2] + [3, 4] |
IN | 元素在列表中 | 3 IN [1, 2, 3] |
[] | 列表索引 | [1, 2, 3][0] |
5. 路径操作符
| 操作符 | 描述 | 示例 |
|---|---|---|
-> | 关系方向 | (a)->(b) |
<- | 反向关系 | (a)<-(b) |
- | 无方向关系 | (a)-(b) |
* | 可变长度 | (a)-[*1..3]->(b) |
语法最佳实践
1. 命名规范
- 节点变量:使用小写字母,如
person、company - 关系变量:使用小写字母,如
friendship、works_at - 标签:使用 PascalCase,如
Person、Company - 关系类型:使用 UPPER_SNAKE_CASE,如
FRIENDS_WITH、WORKS_AT - 属性名:使用 camelCase,如
firstName、lastName
2. 查询优化
使用参数:避免字符串拼接,使用参数化查询
cypher// 好的做法 MATCH (p:Person {name: $name}) RETURN p // 不好的做法 MATCH (p:Person {name: 'John'}) RETURN p使用索引:为频繁查询的属性创建索引
cypherCREATE INDEX FOR (n:Person) ON (n.name)限制结果:使用 LIMIT 限制返回结果
cypherMATCH (p:Person) RETURN p LIMIT 10使用标签:在 MATCH 子句中使用标签
cypher// 好的做法 MATCH (p:Person) RETURN p // 不好的做法 MATCH (p) WHERE labels(p) = ['Person'] RETURN p避免全图扫描:使用标签和属性过滤
cypher// 好的做法 MATCH (p:Person {name: 'John'}) RETURN p // 不好的做法 MATCH (p) WHERE p.name = 'John' RETURN p
3. 代码风格
- 缩进:使用 2 或 4 个空格进行缩进
- 换行:在子句之间换行
- 空格:在操作符周围使用空格
- 注释:使用
//或/* */添加注释
4. 常见错误
- 忘记 RETURN:查询需要 RETURN 子句来返回结果
- 拼写错误:标签、关系类型和属性名的拼写错误
- 类型错误:属性类型不匹配
- 语法错误:缺少括号、逗号等
- 性能问题:未使用索引、全图扫描等
小结
Cypher 是一种强大而直观的查询语言,专为图数据库设计。本文提供了 Cypher 语法的完整参考,包括基本语法结构、模式语法、子句、函数、操作符和最佳实践。通过掌握这些语法和技巧,您可以更有效地使用 Neo4j 进行图数据查询和操作。