Cypher语法基础 #

一、Cypher概述 #

1.1 什么是Cypher #

Cypher是Neo4j的声明式图查询语言,专注于图的模式匹配。它的设计理念是让查询语句易于阅读和编写。

1.2 Cypher特点 #

text
Cypher特点:
├── 声明式语法:描述"要什么"而非"怎么做"
├── 模式匹配:直观表达图结构
├── ASCII艺术:用图形符号表示节点和关系
└── SQL类似:熟悉SQL的开发者容易上手

二、基本语法结构 #

2.1 语句类型 #

语句 用途 示例
MATCH 模式匹配查询 MATCH (n) RETURN n
CREATE 创建节点和关系 CREATE (n:Person)
MERGE 存在则匹配,不存在则创建 MERGE (n:Person {id: 1})
DELETE 删除节点和关系 DELETE n
SET 更新属性和标签 SET n.name = 'Tom'
RETURN 返回结果 RETURN n.name
WHERE 条件过滤 WHERE n.age > 18
WITH 中间处理管道 WITH n ORDER BY n.name

2.2 子句顺序 #

text
标准查询顺序:
├── MATCH / MERGE
├── OPTIONAL MATCH
├── WHERE
├── WITH
├── ORDER BY
├── SKIP / LIMIT
└── RETURN

三、节点语法 #

3.1 节点基本表示 #

cypher
()
(:Label)
(:Label {property: value})
(variable:Label {property: value})

3.2 节点示例 #

cypher
MATCH ()
RETURN ()

MATCH (:Person)
RETURN *

MATCH (p:Person)
RETURN p

MATCH (p:Person {name: 'Tom'})
RETURN p

3.3 多标签节点 #

cypher
CREATE (n:Person:Actor:Director {name: 'Tom'})

四、关系语法 #

4.1 关系基本表示 #

cypher
--
--> 
<--
-[]->
-[:TYPE]->
-[:TYPE {property: value}]->
-[r:TYPE]->
-[r:TYPE*1..3]->

4.2 关系示例 #

cypher
MATCH ()-->()
RETURN *

MATCH ()-[:KNOWS]-()
RETURN *

MATCH ()-[:KNOWS]->()
RETURN *

MATCH ()<-[:KNOWS]-()
RETURN *

MATCH (a)-[r:KNOWS]->(b)
RETURN a, r, b

MATCH (a)-[r:KNOWS {since: 2020}]->(b)
RETURN a, r, b

4.3 无向关系 #

cypher
MATCH (a)-[:KNOWS]-(b)
RETURN a, b

五、模式语法 #

5.1 简单模式 #

cypher
MATCH (p:Person)-[:KNOWS]->(f:Person)
RETURN p, f

5.2 链式模式 #

cypher
MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(c)
RETURN a, b, c

5.3 复杂模式 #

cypher
MATCH (a)-[:KNOWS]->(b)-[:WORKS_AT]->(c:Company)<-[:WORKS_AT]-(d:Person)
RETURN a, b, c, d

5.4 路径变量 #

cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN p

六、变量与命名 #

6.1 变量命名规则 #

text
命名规则:
├── 以字母开头
├── 可包含字母、数字、下划线
├── 区分大小写
└── 不能使用保留字

6.2 有效变量名 #

cypher
MATCH (person:Person)
MATCH (p1:Person)
MATCH (person_name:Person)
MATCH (Person:Person)

6.3 无效变量名 #

cypher
MATCH (1person:Person)
MATCH (my-var:Person)
MATCH (match:Person)

6.4 使用反引号 #

cypher
MATCH (`1person`:Person)
MATCH (`my-var`:Person)
MATCH (`MATCH`:Person)

七、注释 #

7.1 单行注释 #

cypher
MATCH (n:Person)
WHERE n.age > 18
RETURN n

7.2 多行注释 #

cypher
MATCH (n:Person)
WHERE n.age > 18
RETURN n

7.3 行内注释 #

cypher
MATCH (n:Person) -- 查找所有Person节点
WHERE n.age > 18 -- 筛选成年人
RETURN n -- 返回结果

八、操作符 #

8.1 比较操作符 #

操作符 说明 示例
= 等于 n.name = 'Tom'
<> 不等于 n.name <> 'Tom'
< 小于 n.age < 30
> 大于 n.age > 18
<= 小于等于 n.age <= 30
>= 大于等于 n.age >= 18

8.2 逻辑操作符 #

操作符 说明 示例
AND a AND b
OR a OR b
NOT NOT a
XOR 异或 a XOR b

8.3 字符串操作符 #

操作符 说明 示例
STARTS WITH 前缀匹配 n.name STARTS WITH 'T'
ENDS WITH 后缀匹配 n.name ENDS WITH 'm'
CONTAINS 包含 n.name CONTAINS 'om'
=~ 正则匹配 n.name =~ 'T.*'
+ 字符串连接 n.first + ' ' + n.last

8.4 集合操作符 #

操作符 说明 示例
IN 成员判断 n.id IN [1, 2, 3]
+ 集合连接 [1, 2] + [3, 4]
[] 索引访问 list[0]

8.5 NULL操作符 #

操作符 说明 示例
IS NULL 为空 n.name IS NULL
IS NOT NULL 不为空 n.name IS NOT NULL
COALESCE 返回第一个非空值 COALESCE(n.name, 'Unknown')

九、属性访问 #

9.1 点语法 #

cypher
MATCH (n:Person)
RETURN n.name, n.age

9.2 括号语法 #

cypher
MATCH (n:Person)
RETURN n['name'], n['age']

9.3 动态属性访问 #

cypher
MATCH (n:Person)
WITH n, 'name' AS prop
RETURN n[prop]

十、CASE表达式 #

10.1 简单CASE #

cypher
MATCH (n:Person)
RETURN 
  n.name,
  CASE n.status
    WHEN 'active' THEN '活跃'
    WHEN 'inactive' THEN '不活跃'
    ELSE '未知'
  END AS status_text

10.2 搜索CASE #

cypher
MATCH (n:Person)
RETURN 
  n.name,
  CASE 
    WHEN n.age < 18 THEN '未成年'
    WHEN n.age < 60 THEN '成年'
    ELSE '老年'
  END AS age_group

十一、WITH子句 #

11.1 基本用法 #

cypher
MATCH (n:Person)
WITH n.name AS name, n.age AS age
WHERE age > 18
RETURN name, age

11.2 聚合后过滤 #

cypher
MATCH (n:Person)-[:KNOWS]->(f:Person)
WITH n, count(f) AS friend_count
WHERE friend_count > 5
RETURN n.name, friend_count

11.3 数据转换 #

cypher
MATCH (n:Person)
WITH n.name AS name
ORDER BY name
LIMIT 10
RETURN collect(name) AS names

十二、UNWIND子句 #

12.1 展开列表 #

cypher
UNWIND [1, 2, 3] AS x
RETURN x

12.2 批量创建 #

cypher
UNWIND ['Tom', 'Jerry', 'Mike'] AS name
CREATE (p:Person {name: name})

12.3 参数展开 #

cypher
:param names => ['Tom', 'Jerry', 'Mike']
UNWIND $names AS name
CREATE (p:Person {name: name})

十三、RETURN子句 #

13.1 基本返回 #

cypher
MATCH (n:Person)
RETURN n

13.2 返回属性 #

cypher
MATCH (n:Person)
RETURN n.name, n.age

13.3 别名 #

cypher
MATCH (n:Person)
RETURN n.name AS name, n.age AS age

13.4 返回表达式 #

cypher
MATCH (n:Person)
RETURN n.name, n.age * 2 AS double_age

13.5 去重 #

cypher
MATCH (n:Person)
RETURN DISTINCT n.name

十四、ORDER BY子句 #

14.1 升序排序 #

cypher
MATCH (n:Person)
RETURN n.name, n.age
ORDER BY n.age ASC

14.2 降序排序 #

cypher
MATCH (n:Person)
RETURN n.name, n.age
ORDER BY n.age DESC

14.3 多字段排序 #

cypher
MATCH (n:Person)
RETURN n.name, n.age
ORDER BY n.age DESC, n.name ASC

14.4 NULL处理 #

cypher
MATCH (n:Person)
RETURN n.name, n.age
ORDER BY n.age ASC NULLS FIRST

MATCH (n:Person)
RETURN n.name, n.age
ORDER BY n.age DESC NULLS LAST

十五、LIMIT和SKIP #

15.1 LIMIT限制数量 #

cypher
MATCH (n:Person)
RETURN n
LIMIT 10

15.2 SKIP跳过 #

cypher
MATCH (n:Person)
RETURN n
SKIP 10
LIMIT 10

15.3 分页查询 #

cypher
MATCH (n:Person)
RETURN n
ORDER BY n.name
SKIP 20
LIMIT 10

十六、参数化查询 #

16.1 使用参数 #

cypher
:param name => 'Tom'
MATCH (n:Person {name: $name})
RETURN n

16.2 多参数 #

cypher
:param minAge => 18
:param maxAge => 60
MATCH (n:Person)
WHERE n.age >= $minAge AND n.age <= $maxAge
RETURN n

16.3 列表参数 #

cypher
:param names => ['Tom', 'Jerry', 'Mike']
MATCH (n:Person)
WHERE n.name IN $names
RETURN n

十七、语句组合 #

17.1 多个MATCH #

cypher
MATCH (a:Person {name: 'Tom'})
MATCH (b:Person {name: 'Jerry'})
CREATE (a)-[:KNOWS]->(b)

17.2 UNION合并结果 #

cypher
MATCH (n:Person)
RETURN n.name AS name
UNION
MATCH (n:Company)
RETURN n.name AS name

17.3 UNION ALL(保留重复) #

cypher
MATCH (n:Person)
RETURN n.name AS name
UNION ALL
MATCH (n:Company)
RETURN n.name AS name

十八、命名规范建议 #

18.1 标签命名 #

text
建议:
├── 使用大驼峰命名:Person, Company, Product
├── 使用名词:User, Order, Item
└── 避免使用动词:Created, Has

18.2 关系类型命名 #

text
建议:
├── 使用大写蛇形命名:KNOWS, WORKS_AT, FRIEND_OF
├── 使用动词或动词短语:ACTED_IN, DIRECTED_BY
└── 方向性明确:PARENT_OF, CHILD_OF

18.3 属性命名 #

text
建议:
├── 使用小驼峰命名:firstName, lastName
├── 或使用小写蛇形命名:first_name, last_name
└── 保持一致性

十九、总结 #

Cypher语法要点:

概念 语法 示例
节点 () (n:Person)
关系 -[]-> -[:KNOWS]->
属性 {} {name: 'Tom'}
模式 组合 (a)-[:KNOWS]->(b)

最佳实践:

  1. 使用有意义的变量名
  2. 保持命名规范一致
  3. 使用参数化查询防止注入
  4. 合理使用WITH进行数据转换
  5. 添加注释提高可读性

下一步,让我们学习Neo4j的数据类型!

最后更新:2026-03-27