Neo4j 常用语法速查(Cypher)

Cypher 是 Neo4j 的查询语言,类似关系型数据库的 SQL,专门用于操作节点(Node)关系(Relationship)属性(Property)

本文档包含增删改查、索引、函数、高级查询 等高频语法,每条语法带可直接运行的示例,可直接复制使用,适合新手入门和日常开发查阅。

一、基础概念

  • 节点 :实体,用 () 表示,例:(p:Person {name:"张三"})

  • 关系 :节点连接,用 -><- 表示,例:-[:FRIEND]->

  • 标签 :节点分类,用 :标签名 表示

  • 属性 :键值对,用 {key:value} 表示

二、创建语法(CREATE)

1. 创建单个节点

复制代码
# 创建无属性节点
CREATE (n)
​
# 创建带标签+属性的节点
CREATE (p:Person {name:"张三", age:25, city:"北京"})

2. 批量创建节点

复制代码
CREATE (p1:Person {name:"李四", age:23}),
       (p2:Person {name:"王五", age:28})

3. 创建节点+关系(最常用)

复制代码
# 创建两个节点 + 他们之间的关系
CREATE (p:Person {name:"张三"})-[:FRIEND {since:2020}]->(f:Person {name:"赵六"})

4. 给已有节点创建关系

复制代码
# 先匹配节点,再建立关系
MATCH (a:Person {name:"张三"}), (b:Person {name:"李四"})
CREATE (a)-[:COLLEAGUE {department:"研发"}]->(b)

三、查询语法(MATCH + RETURN)

1. 查询所有节点

复制代码
MATCH (n) RETURN n

2. 查询指定标签的所有节点

复制代码
MATCH (p:Person) RETURN p

3. 按属性条件查询节点

复制代码
# 精确匹配
MATCH (p:Person {name:"张三"}) RETURN p
​
# 条件过滤(WHERE)
MATCH (p:Person) WHERE p.age > 25 RETURN p.name, p.age

4. 查询节点+关系(路径查询)

复制代码
# 查询张三的所有朋友
MATCH (p:Person {name:"张三"})-[:FRIEND]->(f) RETURN p.name, f.name
​
# 查询双向关系
MATCH (p)-[:FRIEND]-(f) WHERE p.name="张三" RETURN f

5. 限制返回条数(LIMIT)

复制代码
MATCH (p:Person) RETURN p LIMIT 3

6. 排序(ORDER BY)

复制代码
MATCH (p:Person) RETURN p.name, p.age ORDER BY p.age DESC

四、删除语法(DELETE)

1. 删除单个节点(无关联关系)

复制代码
MATCH (p:Person {name:"赵六"}) DELETE p

2. 删除节点+关联的所有关系(强制删除)

复制代码
MATCH (p:Person {name:"张三"}) DETACH DELETE p

3. 删除关系

复制代码
MATCH (a)-[r:FRIEND]->(b) WHERE a.name="张三" DELETE r

4. 删除所有节点+关系(谨慎使用)

复制代码
MATCH (n) DETACH DELETE n

五、修改语法(SET / REMOVE)

1. 修改/新增节点属性

复制代码
# 修改年龄
MATCH (p:Person {name:"张三"}) SET p.age = 26
​
# 新增属性
MATCH (p:Person {name:"张三"}) SET p.gender = "男"

2. 批量修改属性

复制代码
MATCH (p:Person) SET p.city = "上海"

3. 删除节点属性

复制代码
MATCH (p:Person {name:"张三"}) REMOVE p.city

4. 删除节点标签

复制代码
MATCH (p:Person {name:"张三"}) REMOVE p:Person

六、高级查询语法

1. 模糊查询(CONTAINS / STARTS WITH / ENDS WITH)

复制代码
# 包含"三"
MATCH (p:Person) WHERE p.name CONTAINS "三" RETURN p
​
# 以"张"开头
MATCH (p:Person) WHERE p.name STARTS WITH "张" RETURN p

2. 去重查询(DISTINCT)

复制代码
MATCH (p:Person) RETURN DISTINCT p.city

3. 聚合函数(COUNT / SUM / AVG / MAX / MIN)

复制代码
# 统计人数
MATCH (p:Person) RETURN COUNT(p) AS total
​
# 平均年龄
MATCH (p:Person) RETURN AVG(p.age) AS avg_age

4. 路径深度查询(查找N度关系)

复制代码
# 查找张三的 1~3 度朋友
MATCH (p:Person {name:"张三"})-[:FRIEND*1..3]->(f) RETURN f

5. 多条件组合查询

复制代码
MATCH (p:Person)
WHERE p.age > 20 AND p.city = "北京" OR p.name = "李四"
RETURN p

七、索引与约束(性能优化)

1. 创建索引(加速查询)

复制代码
# 给 Person 标签的 name 属性创建索引
CREATE INDEX idx_person_name FOR (p:Person) ON (p.name)

2. 删除索引

复制代码
DROP INDEX idx_person_name

3. 创建唯一约束(属性不重复)

复制代码
CREATE CONSTRAINT unique_person_name FOR (p:Person) REQUIRE p.name IS UNIQUE

4. 删除约束

复制代码
DROP CONSTRAINT unique_person_name

八、常用函数

1. 字符串函数

复制代码
# 转大写
RETURN UPPER("张三")
​
# 字符串长度
MATCH (p:Person) RETURN length(p.name)

2. 时间函数

复制代码
# 当前时间
RETURN date()
RETURN datetime()

3. 判断函数

复制代码
# 判断属性是否存在
MATCH (p:Person) WHERE exists(p.age) RETURN p

九、MERGE 语法(存在则更新,不存在则创建)

1. 节点 MERGE

复制代码
# 张三存在则不创建,不存在则创建
MERGE (p:Person {name:"张三"})
ON CREATE SET p.create_time = datetime()  # 创建时执行
ON MATCH SET p.update_time = datetime()   # 匹配时执行

2. 关系 MERGE

复制代码
MATCH (a:Person {name:"张三"}), (b:Person {name:"李四"})
MERGE (a)-[:FRIEND]->(b)

十、导入/导出(常用)

1. 从 CSV 导入节点

复制代码
LOAD CSV WITH HEADERS FROM "file:///person.csv" AS row
CREATE (p:Person {name:row.name, age:toInteger(row.age)})

2. 查询结果导出为 CSV

复制代码
MATCH (p:Person) RETURN p.name, p.age

说明:Neo4j Browser 中直接点击查询结果右上角的导出图标,即可保存为 CSV 文件。

十一、核心总结

  • 核心语法CREATE(增)、MATCH(查)、SET(改)、DELETE(删)、MERGE(存在更新)

  • 核心元素 :节点(())、关系(-[]->)、标签(:标签)、属性({}

  • 高频场景:节点+关系创建、条件查询、路径查询、索引优化、去重/聚合

  • 注意事项 :删除关联节点必须使用 DETACH DELETE,避免因关联关系导致删除失败;创建索引和约束可大幅提升查询性能。

相关推荐
24白菜头1 小时前
MySQL学习笔记
数据库·笔记·学习·mysql
小程故事多_801 小时前
深度解析Claude Code,AI编码助手的底层架构与工作原理
java·人工智能·架构·智能体
通往曙光的路上1 小时前
JUCJUCJUC
java·前端·数据库
吴声子夜歌1 小时前
Java——ArrayList
java·arraylist
旷世奇才李先生1 小时前
Java 内置HttpClient 深度实战与性能优化全指南
java
西贝爱学习1 小时前
pdf转TXT文本,适用于文字型PDF;扫描版PDF需要使用OCR(光学字符识别)技术来识别图中的文字
java·服务器·前端
shizhan_cloud1 小时前
MySQL 备份与恢复
数据库·mysql
青柠代码录1 小时前
【JVM】面试题-Java中有哪些引用类型
java·jvm
思麟呀1 小时前
MySQL的内置函数
数据库·mysql