Neo4j Cypher 语法全量速查手册

做图数据库开发、知识图谱搭建、关联数据分析,Cypher 是 Neo4j 必备核心工具。

不同于 SQL 的二维表逻辑,Cypher 适配图数据“节点-关系”的核心结构,语法简洁、逻辑性强,贴合图遍历场景。

本文整理全套可直接落地的 Cypher 语法,包含基础符号、固定执行顺序、核心子句、实操案例及生产避坑点,一次性搞定日常开发 99% 的图查询、写入、更新需求,建议收藏备用。

核心底层逻辑:Cypher 四大核心元素

所有 Cypher 语句均围绕四大要素构建,是读懂所有语法的基础:

  • 节点(Node):图数据基础实体,对应业务对象(用户、商品、设备等)
  • 关系(Relationship):节点之间的关联逻辑,承载实体联动关系
  • 标签(Label):节点分类标识,用于区分不同实体类型
  • 属性(Property):节点/关系的键值对参数,存储具体业务数据

基础语法符号对照表(必记)

Cypher 语法符号辨识度极高,熟记后可快速读懂任意查询语句:

符号技术释义
()节点,完整格式:变量:标签{属性 k:v}
[]关系,完整格式:变量:关系类型{属性参数}
–>有向关系;– 代表无向关系
:标签、关系类型前缀标识
{}存储节点/关系的属性键值对
.属性访问符,例:n.name 获取节点 name 属性

核心子句固定执行顺序

Cypher 子句执行顺序固定不可乱序,乱序会直接报错,这是新手最易踩坑的基础问题。查询类语句标准执行链路:

1
MATCH → WHERE → WITH → RETURN → ORDER BY → SKIP → LIMIT

写入更新类语句(按业务场景按需插入执行):CREATE / MERGE / SET / DELETE

全量核心语法+可直接运行代码案例

MATCH 精准查询(最核心、最高频)

用于匹配节点、关系、路径,是所有图查询的基础,简单过滤可直接写在 MATCH 后,复杂条件统一用 WHERE。

节点查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 匹配所有Person标签节点
MATCH (n:Person) RETURN n

// 字面量属性精准过滤
MATCH (n:Person{name:"张三"}) RETURN n.name, n.age

// 复杂条件推荐用WHERE(多条件、模糊匹配)
MATCH (n:Person)
WHERE n.age >= 20 AND n.name CONTAINS "张"
RETURN n

关系查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 单向好友关系查询
MATCH (a:Person)-[r:FRIEND]->(b:Person)
RETURN a.name, r, b.name

// 不限定关系类型、不限定目标节点标签
MATCH (a:Person)-[r]->(b) RETURN *

// 无向关系查询(不区分上下游方向)
MATCH (a)-[r:KNOWS]-(b) RETURN *

// 带关系属性精准筛选
MATCH (a)-[r:WORK{dept:"研发"}]->(b) RETURN a,b

可变长度路径(图遍历核心)

适用于多层级关联查询,生产环境必须限制遍历深度,杜绝全图遍历。

1
2
3
4
5
// 限定1-3层关联路径(安全合规)
MATCH (a:Person)-[*1..3]->(b) WHERE a.name="张三" RETURN b

// 无深度限制(生产禁用!大数据量会引发全表扫描、内存溢出)
MATCH (a)-[*]->(b)

CREATE 数据创建

用于新建节点、关联关系,无去重逻辑,重复执行会生成重复数据,仅适用于初始化新增场景。

1
2
3
4
5
// 创建单个带属性节点
CREATE (p:Person{name:"李四", age:28})

// 一次性创建双节点+定向关联关系
CREATE (a:Person{name:"张三"})-[:FRIEND{since:2025}]->(b:Person{name:"李四"})

MERGE 合并写入(生产首选 Upsert)

等价于「存在则匹配更新,不存在则新建」,完美解决 CREATE 重复数据问题,是生产环境核心写入语法。

1
2
3
4
5
6
7
8
// 节点匹配/新建+差异化赋值
MERGE (p:Person{name:"张三"})
ON CREATE SET p.age=25        // 仅新建节点时赋值
ON MATCH SET p.updateTime=timestamp()  // 仅匹配到节点时更新时间
RETURN p

// 合并创建关联关系(前置要求:节点必须可正常匹配)
MERGE (a:Person{name:"张三"})-[r:FRIEND]->(b:Person{name:"李四"})

SET / REMOVE 属性更新

用于更新节点、关系的属性,支持新增、修改、删除属性及追加标签。

1
2
3
4
5
6
7
8
9
// 批量更新节点属性
MATCH (n:Person{name:"张三"})
SET n.age=30, n.city="武汉"

// 为节点追加新标签
SET n:Employee

// 删除指定属性
REMOVE n.city

DELETE 数据删除

普通删除需先解除节点关联关系,批量删除推荐使用 DETACH 模式,一步清空节点+关联关系。

1
2
3
4
5
6
7
8
// 仅删除关系(保留两端节点)
MATCH (n)-[r:FRIEND]->(m) DELETE r

// 普通删除节点(前提:节点无任何关联关系,否则报错)
MATCH (n:Person{name:"张三"}) DELETE n

// 生产常用:强制删除节点+所有关联关系(无视关联状态)
MATCH (n:Person{name:"张三"}) DETACH DELETE n

RETURN 返回、别名、排序分页

定义返回字段、结果别名,支持升降序排序、分页截取数据,适配前端展示、数据导出场景。

1
2
3
4
MATCH (n:Person)
RETURN n.name AS 姓名, n.age AS 年龄
ORDER BY n.age DESC    // DESC降序 / ASC升序
SKIP 2 LIMIT 10        // 跳过前2条数据,取后续10条

WITH 管道传递(复杂查询核心)

核心作用:拆分多段逻辑、传递中间结果、替代子查询,让复杂嵌套查询逻辑清晰、可维护性更高。

1
2
3
4
5
// 先筛选20岁以上用户,再查询其好友关系
MATCH (n:Person)
WITH n, n.age AS age WHERE age > 20
MATCH (n)-[:FRIEND]->(f)
RETURN n.name, f.name

常用聚合函数

支持统计、求和、均值、列表聚合,满足数据分析、报表统计需求:count()、sum()、avg()、min()、max()、collect()。

1
2
3
4
5
6
7
// 人数统计、平均年龄计算
MATCH (n:Person)
RETURN count(n) AS total, avg(n.age) AS avg_age

// 聚合好友名单为列表
MATCH (n:Person)-[:FRIEND]->(f)
RETURN n.name, collect(f.name) AS friends

补充区别:count(*) 统计所有结果行;count(n) 仅统计非空有效节点。

WHERE 高级筛选运算符

1
2
3
4
5
6
MATCH (n:Person) WHERE
n.age IN [20,25,30]          // 范围匹配
AND n.name STARTS WITH "张"  // 前缀匹配
AND n.name ENDS WITH "三"    // 后缀匹配
AND n.name CONTAINS "三"     // 模糊匹配
AND n.age IS NOT NULL        // 非空判断

CASE 条件分支判断

实现多条件逻辑分支,适配数据分类、字段映射场景。

1
2
3
4
5
6
7
MATCH (n:Person)
RETURN n.name,
CASE
    WHEN n.age >= 30 THEN "中年"
    WHEN n.age >=18 THEN "青年"
    ELSE "少年"
END AS age_group

索引与约束(性能优化核心)

大数据量场景必须建索引,大幅提升 MATCH 查询效率;唯一约束可保证数据唯一性,自动生成索引。

1
2
3
4
5
// 为Person标签name属性创建普通索引
CREATE INDEX idx_person_name FOR (n:Person) ON (n.name)

// 创建唯一约束(禁止name重复,自动绑定索引)
CREATE CONSTRAINT unique_person_name FOR (n:Person) REQUIRE n.name IS UNIQUE

LOAD CSV 批量数据导入

用于离线批量导入结构化数据,是初始化图谱数据的核心方式。

1
2
3
// 读取本地CSV文件,批量合并写入节点数据
LOAD CSV WITH HEADERS FROM "file:///person.csv" AS row
MERGE (p:Person{name:row.name, age:toInteger(row.age)})

高频落地实操案例

案例1:查询指定用户所有直接好友

1
2
MATCH (a:Person{name:"张三"})-[:FRIEND]->(friend)
RETURN friend.name

案例2:经典社交场景-共同好友查询

1
2
MATCH (a:Person{name:"张三"})-[:FRIEND]->(common)<-[:FRIEND]-(b:Person{name:"李四"})
RETURN common.name AS 共同好友

案例3:两点之间最短路径遍历

1
2
MATCH p=shortestPath((a:Person{name:"张三"})-[*]-(b:Person{name:"王五"}))
RETURN p

生产环境硬核避坑

开发中 80% 的性能问题、数据异常,均来自基础语法使用不规范,重点规避以下问题:

  1. 关系方向规范:大数据量查询必须指定关系方向,无向查询会遍历双向路径,性能损耗翻倍
  2. 禁止无边界遍历:裸写 [*] 会触发全图遍历,数据量过万必卡顿、内存溢出,必须限定深度 [*1..n]
  3. 删除逻辑规范:普通 DELETE 无法删除带关联关系的节点,批量删除优先使用 DETACH DELETE
  4. MERGE 匹配规则:仅完整匹配所有属性才判定为重合,属性存在差异会直接新建节点,需精准控制匹配字段
  5. 过滤逻辑分层:简单常量过滤写在 MATCH,复杂多条件、计算逻辑统一放 WHERE,查询效率最优
  6. 大结果集限流:批量查询、遍历场景必须搭配 LIMIT,防止结果集过大拖垮服务

写在最后:Cypher 语法入门简单、精通在细节,核心是吃透“节点-关系”的图数据思维。这份速查手册覆盖日常开发、数据分析、图谱搭建全场景,无冗余话术,全是可直接落地的硬核代码,建议码住常备!