跳转至

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 中涉及的标签+属性查询有效,合理创建索引可大幅提升查询性能