快速入门 Cypher 语法
Cypher 是图数据库 Neo4j 的查询语言,用于操作"节点(Node)-关系(Relationship)-属性(Property)"构成的图数据模型。以下从核心概念和基础操作带你快速上手。
1. 核心概念理解
图数据库用"节点"表示实体(如用户、商品),"关系"表示实体间关联(如关注、购买),"属性"是实体/关系的键值对信息(如姓名、价格)。
节点(Node):用一对圆括号
()
表示,格式为(标签:Label {属性: 值})
。 示例:表示名为 "Alice"、年龄 30 的用户节点cypher(user:Person {name: 'Alice', age: 30})
关系(Relationship):用一对中括号
[]
表示,格式为-[关系类型:Type {属性: 值}]->
(->
表示方向,双向可省略方向或写--
)。 示例:表示 "Alice" 关注 "Bob" 的关系(带 "创建时间" 属性)cypher-[follow:FOLLOW {created_at: '2024-01-01'}]->
属性(Property):节点/关系的键值对,用 JSON 风格的
{key: value}
定义,值支持字符串、数字、布尔等类型。
2. 基础操作:创建数据
2.1 创建单个节点
用 CREATE
子句,语法:CREATE 节点
。 示例:创建一个标签为 Person
、名为 "Bob" 的节点
CREATE (p:Person {name: 'Bob', age: 25})
2.2 创建节点 + 关系(连缀创建)
用 CREATE
连缀节点和关系,语法:CREATE 起始节点-[关系]->目标节点
。 示例:创建 "Alice" 并让她关注 "Bob"
CREATE (a:Person {name: 'Alice', age: 30})-[f:FOLLOW {created_at: '2024-01-01'}]->(b:Person {name: 'Bob', age: 25})
3. 查询数据:MATCH 与 RETURN
MATCH
用于匹配图中的模式(节点、关系),RETURN
用于返回结果。
3.1 简单查询:匹配单个节点
语法:MATCH 节点模式 RETURN 字段
。 示例:查询所有 Person
节点的姓名
MATCH (p:Person)
RETURN p.name
3.2 带条件过滤:WHERE
用 WHERE
追加条件,语法:MATCH ... WHERE 条件 RETURN ...
。 示例:查询年龄大于 28 的 Person
节点
MATCH (p:Person)
WHERE p.age > 28
RETURN p.name, p.age
3.3 匹配关系(带方向)
语法:MATCH 起始节点-[关系]->目标节点 RETURN ...
。 示例:查询 "Alice" 关注的人(关系方向由 ->
控制)
MATCH (a:Person {name: 'Alice'})-[f:FOLLOW]->(target:Person)
RETURN target.name
4. 更新与删除
4.1 更新属性:SET
用 SET
修改节点/关系的属性,语法:MATCH ... SET 字段 = 新值 RETURN ...
。 示例:将 "Bob" 的年龄改为 26
MATCH (p:Person {name: 'Bob'})
SET p.age = 26
RETURN p.name, p.age
4.2 删除节点/关系:DELETE
删除前需先 MATCH
到目标,再用 DELETE
移除。 示例:删除 "Alice" 关注 "Bob" 的关系
MATCH (a:Person {name: 'Alice'})-[f:FOLLOW]->(b:Person {name: 'Bob'})
DELETE f
5. 高级特性速览
5.1 可变长度路径
用 *
匹配可变长度关系,语法:[关系类型*最小..最大]
。 示例:查找 1-3 跳的关注链
MATCH (a:Person)-[:FOLLOW*1..3]->(b:Person)
RETURN a.name, b.name
5.2 聚合函数
支持 COUNT()
、SUM()
、AVG()
等聚合,常配合 GROUP BY
(隐式)。 示例:统计每人的关注者数量
MATCH (p:Person)<-[:FOLLOW]-(follower:Person)
RETURN p.name, COUNT(follower) AS follower_count
ORDER BY follower_count DESC
5.3 子查询传递:WITH
用 WITH
将中间结果传递给下一步查询。 示例:找出关注者超过 5 人的用户,再查看他们关注的人
MATCH (p:Person)<-[:FOLLOW]-(follower:Person)
WITH p, COUNT(follower) AS follower_count
WHERE follower_count > 5
MATCH (p)-[:FOLLOW]->(following:Person)
RETURN p.name, following.name
6. 关键子句速查表
子句 | 作用 | 示例场景 |
---|---|---|
CREATE | 创建节点/关系 | 新增用户、新增关注关系 |
MATCH | 匹配图中的模式(节点/关系) | 查找特定用户、查找关注链 |
RETURN | 返回查询结果 | 输出节点属性、统计数量 |
WHERE | 过滤条件 | 按年龄/姓名筛选、按关系属性筛选 |
SET | 修改属性 | 更新用户年龄、关系的创建时间 |
DELETE | 删除节点/关系 | 移除无效关系、注销用户节点 |
WITH | 传递中间结果 | 多步查询、复杂过滤条件 |
7. 性能优化提示
- 使用标签过滤:始终指定节点标签
(:Person)
而非匿名节点()
- 创建索引:为常查属性建索引提速cypher
CREATE INDEX ON :Person(name)
- 限制结果:用
LIMIT
控制返回数量,避免大结果集 - 参数化查询:应用中使用参数
$name
而非硬编码值
通过以上 7 步,你已掌握 Cypher 的核心语法逻辑和高频操作。建议结合 Neo4j 沙箱(https://sandbox.neo4j.com/)实操,输入上述代码体验效果~