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 而非硬编码值

通过以上 7 步,你已掌握 Cypher 的核心语法逻辑高频操作。建议结合 Neo4j 沙箱(https://sandbox.neo4j.com/)实操,输入上述代码体验效果~