Skip to content

快速入门 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" 的节点

cypher
CREATE (p:Person {name: 'Bob', age: 25})

2.2 创建节点 + 关系(连缀创建)

CREATE 连缀节点和关系,语法:CREATE 起始节点-[关系]->目标节点。 示例:创建 "Alice" 并让她关注 "Bob"

cypher
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 节点的姓名

cypher
MATCH (p:Person) 
RETURN p.name

3.2 带条件过滤:WHERE

WHERE 追加条件,语法:MATCH ... WHERE 条件 RETURN ...。 示例:查询年龄大于 28 的 Person 节点

cypher
MATCH (p:Person) 
WHERE p.age > 28 
RETURN p.name, p.age

3.3 匹配关系(带方向)

语法:MATCH 起始节点-[关系]->目标节点 RETURN ...。 示例:查询 "Alice" 关注的人(关系方向由 -> 控制)

cypher
MATCH (a:Person {name: 'Alice'})-[f:FOLLOW]->(target:Person) 
RETURN target.name

4. 更新与删除

4.1 更新属性:SET

SET 修改节点/关系的属性,语法:MATCH ... SET 字段 = 新值 RETURN ...。 示例:将 "Bob" 的年龄改为 26

cypher
MATCH (p:Person {name: 'Bob'}) 
SET p.age = 26 
RETURN p.name, p.age

4.2 删除节点/关系:DELETE

删除前需先 MATCH 到目标,再用 DELETE 移除。 示例:删除 "Alice" 关注 "Bob" 的关系

cypher
MATCH (a:Person {name: 'Alice'})-[f:FOLLOW]->(b:Person {name: 'Bob'}) 
DELETE f

5. 高级特性速览

5.1 可变长度路径

* 匹配可变长度关系,语法:[关系类型*最小..最大]。 示例:查找 1-3 跳的关注链

cypher
MATCH (a:Person)-[:FOLLOW*1..3]->(b:Person)
RETURN a.name, b.name

5.2 聚合函数

支持 COUNT()SUM()AVG() 等聚合,常配合 GROUP BY(隐式)。 示例:统计每人的关注者数量

cypher
MATCH (p:Person)<-[:FOLLOW]-(follower:Person)
RETURN p.name, COUNT(follower) AS follower_count
ORDER BY follower_count DESC

5.3 子查询传递:WITH

WITH 将中间结果传递给下一步查询。 示例:找出关注者超过 5 人的用户,再查看他们关注的人

cypher
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. 性能优化提示

  1. 使用标签过滤:始终指定节点标签 (:Person) 而非匿名节点 ()
  2. 创建索引:为常查属性建索引提速
    cypher
    CREATE INDEX ON :Person(name)
  3. 限制结果:用 LIMIT 控制返回数量,避免大结果集
  4. 参数化查询:应用中使用参数 $name 而非硬编码值

8. 使用 Kuzu 体验 Cypher

Kuzu 是一个嵌入式的图数据库,专为查询速度和可扩展性而设计。它针对非常大的图进行优化,以处理复杂的连接密集型分析工作负载,具备以下核心功能:

  • 属性图数据模型和 Cypher 查询语言
  • 内嵌(进程内)的应用程序集成
  • 列式基于磁盘的存储
  • 列式压缩的稀疏行基(CSR)邻接列表和连接索引
  • 向量化的因子化查询处理
  • 新颖且高效的连接算法
  • 多核查询并行处理
  • 可串行化的 ACID 事务

Kuzu 是单个可执行文件,下载后直接运行即可。访问 Kuzu Installation 获取最新版本。

下载示例数据:

bash
curl -o tutorial_data.zip https://kuzudb.com/data/tutorial/tutorial_data.zip
unzip tutorial_data.zip
rm tutorial_data.zip

启动 Kuzu 命令行:

bash
kuzu

加载示例数据:

cypher
COPY User FROM 'tutorial_data/node/user.csv';
COPY Post FROM 'tutorial_data/node/post.csv';
COPY LIKES FROM 'tutorial_data/relation/LIKES.csv';
COPY FOLLOWS FROM 'tutorial_data/relation/FOLLOWS.csv';
COPY POSTED FROM 'tutorial_data/relation/POSTS.csv';

执行示例查询:

cypher
MATCH (a:User) RETURN a.* LIMIT 3;

更多查询示例,参考 Kuzu Cypher Tutorial

退出:

cypher
:quit