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,避免因关联关系导致删除失败;创建索引和约束可大幅提升查询性能。