掌握 Cypher 的增删改查是 Neo4j 日常开发的基线能力。本文在 Neo4j-01 入门示例之上,系统梳理 CRUD(create, read, update, delete,增删改查)、幂等写入、约束与事务——覆盖应用开发与数据同步的常见写法。
一、读(Read):MATCH 与 RETURN
1.1 基础匹配
1 | // 按标签 + 属性 |
1.2 关系模式
1 | // 指定方向与类型 |
1.3 可选匹配与聚合
1 | // OPTIONAL MATCH:左连接语义,无匹配时 NULL |
1.4 排序、分页、去重
1 | MATCH (n:Paper) |
二、增(Create)
2.1 CREATE:总是新建
1 | CREATE (p:Person {id: randomUUID(), name: 'Carol', created: datetime()}) |
1 | // 一次创建路径 |
注意:重复执行会产生重复节点,除非有唯一约束 + MERGE。
2.2 MERGE:幂等 upsert
1 | MERGE (p:Person {email: 'alice@example.com'}) |
1 | // MERGE 整条模式(节点 + 关系) |
| 语句 | 语义 |
|---|---|
CREATE |
无条件新建 |
MERGE |
按模式匹配,不存在则创建 |
三、改(Update):SET / REMOVE
3.1 更新属性
1 | MATCH (p:Person {name: 'Alice'}) |
3.2 标签与属性删除
1 | MATCH (p:Person {name: 'Alice'}) |
3.3 关系属性更新
1 | MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'}) |
3.4 条件更新(CASE)
1 | MATCH (p:Person) |
四、删(Delete)
4.1 删关系
1 | MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'}) |
4.2 删节点
1 | // 无关系的节点 |
4.3 批量删除(生产谨慎)
1 | // 分批删,避免大事务 OOM |
Neo4j 5+ 支持 CALL { ... } IN TRANSACTIONS 自动分批提交。
五、约束与索引(数据质量 + 性能)
在 Neo4j Browser 或 cypher-shell 中执行:
1 | // 唯一约束(自动建索引) |
| 类型 | 作用 |
|---|---|
| UNIQUE | 保证业务键唯一;MERGE 锚点 |
| NOT NULL | 必填字段 |
| INDEX | 加速 WHERE 过滤 |
查看已有约束:
1 | SHOW CONSTRAINTS; |
六、参数化查询(防注入 + 计划缓存)
6.1 Browser / cypher-shell
1 | :param name => 'Alice'; |
6.2 Python 驱动
1 | driver.execute_query( |
永远不要拼接字符串构造 Cypher。
七、事务语义
Neo4j 支持 ACID 事务(单库内):
| 层级 | 说明 |
|---|---|
| 自动事务 | 每条 Cypher 默认一条事务 |
| 显式事务 | 驱动 session.execute_write() 内多条语句同一事务 |
| 隔离 | 默认可重复读;写冲突时后者失败 |
Python 显式事务示例:
1 | def create_friendship(tx, name_a, name_b): |
八、常用 CRUD 模式速查
| 意图 | Cypher 模式 |
|---|---|
| 按主键 upsert 节点 | MERGE (n:Label {id: $id}) SET n += $props |
| upsert 边 | MERGE (a)-[r:TYPE]->(b) SET r += $props |
| 软删除 | SET n.deleted = true, n.deletedAt = timestamp() |
| 硬删子图 | MATCH (n:Root {id: $id}) DETACH DELETE n |
| 只删某类型关系 | MATCH ()-[r:OLD_TYPE]->() DELETE r |
| 属性批量刷新 | MATCH (n:Label) SET n.version = $v |
九、与 SQL 对照(帮助 SQL 背景读者)
| SQL | Cypher |
|---|---|
INSERT |
CREATE / MERGE |
SELECT ... JOIN |
MATCH ... RETURN |
UPDATE ... SET |
MATCH ... SET |
DELETE |
DELETE / DETACH DELETE |
WHERE |
WHERE(在 MATCH 后) |
GROUP BY |
RETURN ... count() |
| 外键约束 | CREATE CONSTRAINT ... UNIQUE |
十、小结
- 读用
MATCH+RETURN;多跳用*min..max;左连接用OPTIONAL MATCH。 - 增区分
CREATE(必新建)与MERGE(幂等);生产同步几乎总是 MERGE。 - 改用
SET/REMOVE;删关系用DELETE,删节点用DETACH DELETE。 - 唯一约束是 MERGE 正确性的前提;大批量删除用 IN TRANSACTIONS 分批。
| 下一篇 | 内容 |
|---|---|
| Neo4j-04.数据导入与对接工具 | LOAD CSV、bulk import、驱动 |
| Neo4j-05.查询进阶与性能调优 | EXPLAIN、路径优化 |