一,背景
Neo4j 的 Cypher 语言是为处理图形数据而构建的,CQL 代表 Cypher 查询语言。像 Oracle 数据库具有查询 语言 SQL,Neo4j 具有 CQL 作为查询语言。CQL 是 Neo4j 图形数据库的查询语言,是一种声明性模式匹配语言,遵循 SQL 语法,其语法是非常简单且人性化、可读的格式。
二,图数据模型
Neo4j 的核心就两个概念:
| 概念 | 图形表示 | 说明 |
|---|---|---|
| Node(节点) | 🔵 圆圈 | 代表实体,如:人、文章、标签 |
| Relationship(关系) | ➡️ 箭头 | 代表节点间的连接,如:张三→写了→文章1 |
节点有 Label(标签),相当于分类,比如 :Person、:Article
关系有 Type(类型),描述连接方式,比如 :WROTE、:TAGGED
节点和关系都可以有属性,用 {key: value} 表示
三,基础语法
3.1 创建节点和关系(CREATE)
3.1.1 创建节点
// 创建一个Person节点
CREATE (p:Person {name: '张三', age: 28, city: '杭州'})
RETURN p
语法拆解:
(p)— 变量p,代表这个节点,方便后续引用:Person— 标签,表示这是"人"类型{...}— 属性,JSON格式RETURN p— 返回创建的结果,不写就不返回
3.1.2 创建多个节点
CREATE (:Person {name: '李四', age: 32}),
(:Person {name: '王五', age: 25}),
(:Article {title: '学习Cypher', category: '技术'})
3.1.3 创建关系
// 先查找已有节点,然后创建关系
MATCH (a:Person {name: '张三'})
MATCH (b:Article {title: '学习Cypher'})
CREATE (a)-[:WROTE {date: date('2026-05-22')}]->(b)
RETURN a, b
语法拆解:
(a)-[:WROTE]->(b)— 表示a指向b,关系类型是WROTE- 关系上也可以带属性,比如
{date: ...}
3.1.4 一次性创建节点+关系
CREATE (p:Person {name: '赵六', age: 30})
-[:WROTE {date: date('2026-05-20')}]->
(art:Article {title: '图数据库入门', category: '数据库'})
RETURN p, art
3.2 查询数据(MATCH + RETURN)
MATCH 相当于 SQL 的 SELECT,但用的是模式匹配。
3.2.1 查所有节点
MATCH (n) RETURN n LIMIT 25
3.2.2 按标签和属性查找
// 找所有Person
MATCH (p:Person) RETURN p
// 按属性过滤
MATCH (p:Person {name: '张三'}) RETURN p
// 用WHERE条件
MATCH (p:Person)
WHERE p.age > 26
RETURN p.name, p.age
3.2.3 查询关系
// 谁写了文章?
MATCH (p:Person)-[:WROTE]->(a:Article)
RETURN p.name, a.title
// 谁写了什么文章?包括关系属性
MATCH (p:Person)-[r:WROTE]->(a:Article)
RETURN p.name, a.title, r.date
3.3 更新和删除(SET, REMOVE, DELETE)
3.3.1 更新属性
// SET 添加或修改属性
MATCH (p:Person {name: '张三'})
SET p.age = 29, p.blog = 'zhangsan.tech'
RETURN p
3.3.2 删除属性
MATCH (p:Person {name: '张三'})
REMOVE p.blog
RETURN p
3.2.3 删除关系
MATCH (p:Person {name: '张三'})-[r:WROTE]->(a:Article {title: '学习Cypher'})
DELETE r
3.2.4 删除节点
// 先删关系,再删节点(不能删还有关系的节点)
MATCH (p:Person {name: '赵六'})
DETACH DELETE p // DETACH自动删掉所有关联关系
3.4 常用函数
| 函数 | 说明 | 示例 |
|---|---|---|
count() | 计数 | RETURN count(p) |
collect() | 聚合成列表 | RETURN collect(p.name) |
date() | 创建日期 | date('2026-05-22') |
type() | 取关系类型 | RETURN type(r) |
labels() | 取节点标签 | RETURN labels(n) |
exists() | 检查属性存在 | WHERE exists(n.email) |