OpenCypher 完整语法速查表¶
说明:本速查表按 CRUD 操作分类,包含 OpenCypher 所有核心语法、规则、函数及示例,可直接复制保存为 .txt 或 .md 文件,离线查阅便捷。
一、基础语法规则¶
1. 大小写与标识符¶
-
关键字:不区分大小写(MATCH / match / Match 完全等价)
-
标识符:变量、标签、关系类型、属性名,区分大小写(如 :Person 和 :person 是两个不同标签)
-
命名规则:以字母、下划线开头,可包含字母、数字、下划线、$、#
-
核心保留字:MATCH、WHERE、RETURN、CREATE、DELETE、SET、WITH、UNWIND、UNION、MERGE、REMOVE
2. 注释语法¶
-
单行注释:// 注释内容(示例:// 匹配所有用户节点)
-
多行注释:/* 注释内容 /(示例:/ 批量创建节点和关系,用于初始化数据 */)
3. 数据类型¶
| 类型分类 | 具体类型 | 说明 | 示例 |
|---|---|---|---|
| 标量类型(基础值) | INTEGER(整数) | 正负整数,无长度限制 | 10、-5、100000 |
| FLOAT(浮点数) | 带小数的数值 | 3.14、-0.5、10.0 | |
| BOOLEAN(布尔值) | 逻辑值,仅两个可选值 | true、false | |
| STRING(字符串) | 文本内容,单引号、双引号均可 | "Alice"、'TechCorp' | |
| NULL | 空值,表示无数据 | p.age IS NULL | |
| 时间类型 | DATE(日期) | 仅日期,格式 yyyy-MM-dd | date()、date("2026-03-28") |
| DATETIME(日期时间) | 带时区的日期时间 | datetime()、datetime("2026-03-28T10:30:00") | |
| TIME(时间) | 仅时间,带时区 | time()、time("10:30:00") | |
| LOCALDATETIME(本地日期时间) | 不带时区的日期时间 | localdatetime("2026-03-28T10:30:00") | |
| LOCALTIME(本地时间) | 不带时区的时间 | localtime("10:30:00") | |
| DURATION(时长) | 时间间隔 | duration({days:1, hours:2}) | |
| 复合类型 | LIST(列表) | 有序、可重复的集合 | [1,2,3]、["Alice","Bob"] |
| MAP(映射) | 键值对集合,键为字符串 | {name: "Alice", age: 30} |
二、核心图元素语法(基础)¶
1. 节点(Node)¶
语法格式:(变量:标签1:标签2 {属性键1: 属性值1, 属性键2: 属性值2})
说明:变量、标签、属性均为可选,多标签用冒号分隔,属性为键值对集合
// 1. 空节点(无变量、无标签、无属性)
()
// 2. 带变量的节点(变量用于后续引用)
(n)
// 3. 带单个标签的节点(标签用于分类)
(:Person)
// 4. 带多个标签的节点
(:Person:Employee:Manager)
// 5. 完整节点(变量+标签+属性)
(p:Person {name: "Alice", age: 30, city: "Beijing", email: "alice@example.com"})
2. 关系(Relationship)¶
语法格式:-[变量:关系类型 {属性键: 属性值}]->
说明:方向可选(->出、<--入、--无向),变量可选,关系类型必选(仅单个类型),属性可选
// 1. 无向关系(无变量、无类型、无属性)
--
// 2. 有向关系(出关系)
->
// 3. 有向关系(入关系)
<--
// 4. 带类型的关系(核心必写)
-[:FRIENDS_WITH]->
// 5. 带变量的关系(变量用于后续引用)
-[r]->
// 6. 完整关系(变量+类型+属性)
-[r:FRIENDS_WITH {since: 2020, status: "close"}]->
3. 模式(Pattern)¶
说明:节点与关系的组合,用于描述图结构,是 MATCH、CREATE 等子句的核心
// 1. 简单路径(两个节点+一条关系)
(a:Person)-[:FRIENDS_WITH]->(b:Person)
// 2. 变长路径(1到5层关系,范围可调整)
(a:Person)-[:KNOWS*1..5]->(b:Person)
// 3. 任意长度路径(无上限,慎用,避免性能问题)
(a:Person)-[:FOLLOWS*]->(b:Person)
// 4. 多模式匹配(多个独立节点/路径)
(a:Person), (b:Company), (a)-[:WORKS_FOR]->(b)
// 5. 路径变量(保存完整路径,用于后续操作)
path = (a)-[:KNOWS]->(b)-[:FRIENDS_WITH]->(c)
三、CRUD 核心操作语法(重点)¶
(一)查询(Read):查找数据¶
1. MATCH:模式匹配(核心查询子句)¶
作用:查找图中匹配指定模式的节点、关系或路径
// 示例1:匹配所有 Person 节点
MATCH (p:Person)
// 示例2:匹配 Person 节点及其朋友关系
MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person)
// 示例3:匹配路径并保存为变量
MATCH path = (a:Person)-[:KNOWS*1..3]->(b:Person)
// 示例4:匹配多个模式(Person 和 Company 节点,及雇佣关系)
MATCH (p:Person), (c:Company), (p)-[:WORKS_FOR]->(c)
2. WHERE:条件过滤¶
作用:对 MATCH 或 WITH 的结果进行筛选,支持多条件组合
// 示例1:基础条件(年龄大于18,城市为北京)
MATCH (p:Person)
WHERE p.age > 18 AND p.city = "Beijing"
RETURN p.name
// 示例2:字符串匹配(姓名包含"Li")
MATCH (p:Person)
WHERE p.name CONTAINS "Li" // 包含(不区分大小写)
// WHERE p.name STARTS WITH "A" // 以A开头
// WHERE p.name ENDS WITH "e" // 以e结尾
RETURN p.name
// 示例3:列表匹配(城市在指定列表中)
MATCH (p:Person)
WHERE p.city IN ["Beijing", "Shanghai", "Guangzhou"]
RETURN p.name, p.city
// 示例4:属性存在性(存在 email 属性)
MATCH (p:Person)
WHERE EXISTS(p.email)
RETURN p.name, p.email
// 示例5:空值判断
MATCH (p:Person)
WHERE p.age IS NOT NULL
RETURN p.name, p.age
3. RETURN:返回结果¶
作用:指定查询返回的数据,是查询的结束子句,支持别名、聚合、去重
// 示例1:返回节点的指定属性
MATCH (p:Person)
WHERE p.age > 18
RETURN p.name, p.age, p.city
// 示例2:返回别名(简化输出)
MATCH (p:Person)
RETURN p.name AS userName, p.age AS userAge
// 示例3:聚合查询(统计、平均值等)
MATCH (p:Person)
RETURN COUNT(p) AS totalPerson, // 总人数
AVG(p.age) AS avgAge, // 平均年龄
MIN(p.age) AS minAge, // 最小年龄
MAX(p.age) AS maxAge // 最大年龄
// 示例4:去重返回(避免重复结果)
MATCH (p:Person)-[:WORKS_FOR]->(c:Company)
RETURN DISTINCT c.name AS companyName // 去重返回公司名称
// 示例5:返回路径相关信息
MATCH path = (a:Person)-[:FRIENDS_WITH]->(b:Person)
RETURN nodes(path) AS allNodes, // 路径中的所有节点
relationships(path) AS allRels, // 路径中的所有关系
length(path) AS pathLength // 路径长度(关系数量)
4. WITH:中间结果传递¶
作用:处理中间结果,将结果传递给后续子句(类似 SQL 的 HAVING,可用于聚合后过滤)
// 示例:查询朋友数大于5的用户
MATCH (p:Person)-[:FRIENDS_WITH]->(f:Person)
WITH p, COUNT(f) AS friendCount // 中间结果:用户及其朋友数
WHERE friendCount > 5 // 过滤朋友数大于5的用户
RETURN p.name, friendCount // 返回最终结果
5. UNWIND:展开列表¶
作用:将列表拆分为多行,便于后续处理(常用于批量操作)
// 示例1:展开简单列表
UNWIND [1, 2, 3, 4, 5] AS num
RETURN num * 2 AS doubleNum // 输出每个数字的2倍
// 示例2:展开节点属性列表
MATCH (p:Person {name: "Alice"})
UNWIND p.hobbies AS hobby // 假设 p.hobbies 是列表 ["reading", "travel"]
RETURN p.name, hobby
6. ORDER BY / LIMIT / SKIP:排序与分页¶
作用:对返回结果排序、限制数量、跳过指定行数(用于分页查询)
// 示例:分页查询(跳过前10条,取5条,按年龄降序、姓名升序)
MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age DESC, p.name ASC // 先按年龄降序,再按姓名升序
SKIP 10 // 跳过前10条
LIMIT 5 // 取5条结果
7. UNION / UNION ALL:结果合并¶
作用:合并多个查询的结果,UNION 去重,UNION ALL 不去重(要求两个查询返回列数、类型一致)
// 示例1:UNION(去重合并)
MATCH (p:Person) RETURN p.name AS name
UNION
MATCH (c:Company) RETURN c.name AS name
// 示例2:UNION ALL(不去重合并,性能更优)
MATCH (p:Person {city: "Beijing"}) RETURN p.name AS name
UNION ALL
MATCH (p:Person {city: "Shanghai"}) RETURN p.name AS name
(二)创建(Create):新增数据¶
1. CREATE:直接创建¶
作用:创建节点、关系或节点+关系的组合(每次执行都会创建新数据,即使重复)
// 示例1:创建单个节点
CREATE (p:Person {name: "Bob", age: 28, city: "Shanghai"})
// 示例2:创建多个节点(用逗号分隔)
CREATE (p1:Person {name: "Charlie"}), (c:Company {name: "TechCorp", address: "Beijing"})
// 示例3:创建节点+关系(一次性创建关联数据)
CREATE (a:Person {name: "Dave"})-[:WORKS_FOR {since: 2022, position: "Engineer"}]->(c:Company {name: "TechCorp"})
// 示例4:创建带多标签的节点
CREATE (p:Person:Student {name: "Eve", age: 20, school: "Beijing University"})
2. MERGE:匹配或创建¶
作用:确保指定模式存在——若存在则匹配,若不存在则创建(避免重复创建,常用)
// 示例1:匹配或创建节点
MERGE (p:Person {name: "Dave"}) // 若存在 name=Dave 的 Person 节点,直接匹配;否则创建
ON CREATE SET p.createdAt = timestamp() // 仅创建时执行:设置创建时间戳
ON MATCH SET p.updatedAt = timestamp() // 仅匹配时执行:更新时间戳
// 示例2:匹配或创建节点+关系
MATCH (a:Person {name: "Alice"}), (b:Person {name: "Bob"})
MERGE (a)-[:FRIENDS_WITH]->(b) // 若关系存在,匹配;否则创建
ON CREATE SET a.friendCount = COALESCE(a.friendCount, 0) + 1 // 创建关系时,更新朋友数
(三)更新(Update):修改数据¶
1. SET:添加/修改属性、标签¶
作用:为节点/关系添加新属性、修改已有属性,或为节点添加标签
// 示例1:修改单个属性
MATCH (p:Person {name: "Alice"})
SET p.age = 31 // 修改年龄
// 示例2:修改多个属性
MATCH (p:Person {name: "Alice"})
SET p.city = "Shanghai", p.email = "alice_new@example.com"
// 示例3:批量设置属性(用 MAP 简化)
MATCH (p:Person {name: "Alice"})
SET p += {phone: "123456789", gender: "female"} // 批量添加/修改属性
// 示例4:为节点添加标签
MATCH (p:Person {name: "Alice"})
SET p:Employee // 为 Alice 节点添加 Employee 标签
2. REMOVE:删除属性、标签¶
作用:删除节点/关系的属性,或删除节点的标签(不能删除关系类型)
// 示例1:删除单个属性
MATCH (p:Person {name: "Alice"})
REMOVE p.phone // 删除 phone 属性
// 示例2:删除多个属性(用逗号分隔)
MATCH (p:Person {name: "Alice"})
REMOVE p.phone, p.gender
// 示例3:删除节点的标签
MATCH (p:Person {name: "Alice"})
REMOVE p:Employee // 删除 Alice 节点的 Employee 标签
(四)删除(Delete):删除数据¶
注意:删除节点前,必须先删除该节点的所有关系(否则报错);DETACH DELETE 可级联删除节点及所有关系
// 示例1:删除关系(先匹配关系,再删除)
MATCH (a:Person {name: "Alice"})-[r:FRIENDS_WITH]->(b:Person {name: "Bob"})
DELETE r // 删除该朋友关系
// 示例2:删除节点(需先删除关系,否则报错)
MATCH (p:Person {name: "Dave"})
MATCH (p)-[r]->() // 匹配 p 的所有出关系
DELETE r, p // 先删除关系,再删除节点
// 示例3:级联删除(推荐,自动删除节点及所有关系)
MATCH (p:Person {name: "Dave"})
DETACH DELETE p // 一次性删除节点和所有关联关系
// 示例4:删除所有匹配的节点和关系
MATCH (p:Person)-[r:WORKS_FOR]->(c:Company {name: "OldCorp"})
DETACH DELETE p, r, c // 删除用户、雇佣关系、公司节点
四、函数与表达式(常用)¶
1. 聚合函数(用于 RETURN / WITH 聚合查询)¶
-
COUNT(表达式):统计数量(COUNT(*) 统计所有行,COUNT(p) 统计非空节点)
-
SUM(表达式):求和(仅适用于数值类型)
-
AVG(表达式):求平均值(仅适用于数值类型)
-
MIN(表达式):求最小值
-
MAX(表达式):求最大值
-
COLLECT(表达式):将结果收集为列表
// 示例:聚合函数使用
MATCH (p:Person)-[:WORKS_FOR]->(c:Company)
RETURN c.name AS company,
COUNT(p) AS employeeCount, // 公司员工数
AVG(p.age) AS avgEmployeeAge, // 员工平均年龄
COLLECT(p.name) AS employeeNames // 员工姓名列表
2. 标量函数(处理单个值)¶
(1)数学函数¶
abs(-5) → 5 // 绝对值
ceil(3.14) → 4 // 向上取整
floor(3.99) → 3 // 向下取整
round(3.5) → 4 // 四舍五入
rand() → 0.123... // 生成0-1之间的随机数
(2)字符串函数¶
length("Alice") → 5 // 字符串长度
toUpper("Alice") → "ALICE" // 转为大写
toLower("ALICE") → "alice" // 转为小写
replace("Alice", "A", "B") → "Blice" // 替换字符串
substring("Alice", 1, 3) → "lic" // 截取子串(起始索引,长度)
(3)时间函数¶
date() → date("2026-03-28") // 当前日期
datetime() → datetime("2026-03-28T10:30:00") // 当前日期时间
timestamp() → 1711585800000 // 当前时间戳(毫秒)
duration({days:1, hours:2}) → duration({days:1, hours:2}) // 时长
(4)图相关函数¶
id(p) → 123 // 节点/关系的唯一ID
labels(p) → ["Person", "Employee"] // 节点的所有标签
type(r) → "FRIENDS_WITH" // 关系的类型
properties(p) → {name: "Alice", age: 30} // 节点/关系的所有属性
3. 列表函数(处理列表)¶
head([1,2,3]) → 1 // 列表第一个元素
last([1,2,3]) → 3 // 列表最后一个元素
tail([1,2,3]) → [2,3] // 列表去掉第一个元素后的部分
range(1,5) → [1,2,3,4,5] // 生成指定范围的列表
reverse([1,2,3]) → [3,2,1] // 反转列表
size([1,2,3]) → 3 // 列表长度
4. CASE 表达式(条件判断)¶
作用:类似编程语言的 if-else,用于根据条件返回不同值
MATCH (p:Person)
RETURN p.name,
CASE
WHEN p.age < 18 THEN 'Minor' // 年龄<18:未成年
WHEN p.age >= 18 AND p.age < 60 THEN 'Adult' // 18≤年龄<60:成年
ELSE 'Elderly' // 其他:老年
END AS ageGroup
五、高级特性(进阶)¶
1. 模式理解(Pattern Comprehension)¶
作用:将模式匹配的结果直接收集为列表,简化查询
// 示例:查询每个用户的朋友姓名列表
MATCH (p:Person)
RETURN p.name,
// 模式理解:匹配 p 的朋友,收集朋友姓名为列表
[p_friend IN [(p)-[:FRIENDS_WITH]->(f) | f.name] | p_friend] AS friendNames
2. 索引与约束(优化性能、保证数据完整性)¶
// (1)创建索引(用于加速查询,基于标签+属性)
CREATE INDEX FOR (p:Person) ON (p.name) // 为 Person 标签的 name 属性创建索引
CREATE INDEX FOR (c:Company) ON (c.address) // 为 Company 标签的 address 属性创建索引
// (2)创建唯一约束(保证属性值唯一,避免重复)
CREATE CONSTRAINT ON (p:Person) ASSERT p.email IS UNIQUE // Person 的 email 唯一
CREATE CONSTRAINT ON (c:Company) ASSERT c.name IS UNIQUE // Company 的 name 唯一
// (3)删除索引
DROP INDEX FOR (p:Person) ON (p.name)
// (4)删除约束
DROP CONSTRAINT ON (p:Person) ASSERT p.email IS UNIQUE
3. 事务控制(可选,部分数据库支持)¶
// 开启事务
BEGIN TRANSACTION
// 执行操作(创建、修改、删除等)
CREATE (p:Person {name: "Frank"})
MATCH (p:Person {name: "Frank"}) SET p.age = 35
// 提交事务(确认修改)
COMMIT
// 回滚事务(取消修改)
ROLLBACK
六、完整查询示例(综合运用)¶
// 示例:查询30岁以上北京用户的朋友,及其朋友所在的公司,分页返回
MATCH (p:Person)-[:FRIENDS_WITH]->(f:Person)-[:WORKS_FOR]->(c:Company)
// 条件过滤:用户年龄>30,城市为北京
WHERE p.age > 30 AND p.city = "Beijing"
// 中间结果:用户、朋友信息、公司信息,收集朋友及公司列表
WITH p, COLLECT({friendName: f.name, companyName: c.name, position: f.position}) AS friendsCompanyInfo
// 按用户姓名升序排序,跳过前5条,取10条
ORDER BY p.name ASC
SKIP 5 LIMIT 10
// 返回最终结果
RETURN p.name AS userName,
p.age AS userAge,
friendsCompanyInfo AS friendsAndCompanies
七、常见注意事项¶
-
关系类型仅支持单个,不能同时指定多个类型(如 -[:FRIENDS_WITH:COLLEAGUE]-> 是错误的)
-
变长路径查询()慎用,尤其是无上限的路径(如 -[:KNOWS]->),会严重影响查询性能
-
删除节点时,必须先删除其所有关系,或使用 DETACH DELETE 级联删除
-
UNION 要求两个查询返回的列数、数据类型完全一致,否则报错
-
索引仅对 MATCH、WHERE 中涉及的标签+属性查询有效,合理创建索引可大幅提升查询性能