做图数据库开发、知识图谱搭建、关联数据分析,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..n]
- 删除逻辑规范:普通 DELETE 无法删除带关联关系的节点,批量删除优先使用 DETACH DELETE
- MERGE 匹配规则:仅完整匹配所有属性才判定为重合,属性存在差异会直接新建节点,需精准控制匹配字段
- 过滤逻辑分层:简单常量过滤写在 MATCH,复杂多条件、计算逻辑统一放 WHERE,查询效率最优
- 大结果集限流:批量查询、遍历场景必须搭配 LIMIT,防止结果集过大拖垮服务
写在最后:Cypher 语法入门简单、精通在细节,核心是吃透“节点-关系”的图数据思维。这份速查手册覆盖日常开发、数据分析、图谱搭建全场景,无冗余话术,全是可直接落地的硬核代码,建议码住常备!