玩转图数据库:Neo4j 与 Cypher 语言

从“数据孤岛”到“星辰大海”的理论基础课

本节课学习地图

初识 Neo4j

  • 传统数据库的痛点
  • 图数据库的概念
  • 四大核心元素

Cypher 入门

  • 什么是 Cypher 语言
  • 三大基础数据类型
  • 命名规范与关键字

核心操作语法

  • 增 (CREATE)
  • 查 (MATCH, RETURN)
  • 改与删 (SET, DELETE)

第一站:认识 Neo4j

为什么我们需要一种“新”的数据库?
图数据库到底解决什么痛点?

回顾:关系型数据库(如 MySQL)的局限

表格的困境

大家大一学过 MySQL,数据存在“表”里(行和列)。


  • 找“张三的好友”很简单。
  • 找“张三的好友的好友”需要连表(JOIN)。
  • 找“张三的六度人脉”... 数据库可能直接卡死崩溃!

为什么会这样?

在关系型数据库中,表与表之间的关系是隐式的(通过外键)。


每次查询“关系”,数据库都需要重新计算一次映射,就像每次找人都要翻一遍全国户口本,非常耗时。

破局:什么是图数据库?

图(Graph)= 节点 + 关系

图数据库不使用死板的表格,而是像画思维导图一样,直接把事物和它们之间的关联“画”出来并存储。


在这里,关系和数据本身一样重要

什么是 Neo4j?

行业霸主

Neo4j 是目前全球最流行、最强大的图数据库管理系统之一。

  • 它是一个原生的(Native)图数据库。
  • 专门为存储、管理和查询“图”结构数据而设计。
  • 采用 Java 语言开发。

它的强项在哪里?

相比传统数据库,它在处理以下场景时性能提升上千倍:

  • 社交网络关系(谁认识谁)
  • 推荐系统(猜你喜欢)
  • 知识图谱(百度百科背后的逻辑)
  • 金融反欺诈(识别洗钱网络)

Neo4j 的四大核心元素

要学好图数据库,必须死死记住这四个基本零件(就像乐高积木一样):

1

节点

(Node)

2

关系

(Relationship)

3

属性

(Property)

4

标签

(Label)

核心一:节点 (Node)

图中的“实体”

节点就相当于传统数据库表中的“一行数据”


  • 它可以代表一个人、一个公司、一本书、一个地点等。
  • 在图中,节点通常用圆圈表示。
  • 例如:圆圈里写着“刘德华”,这就是一个实体节点。

核心二:关系 (Relationship)

连接节点的“桥梁”

没有关系的图只是一堆散落的沙子。关系让数据产生了联系。


  • 关系必须有起点终点(有方向性)。
  • 关系必须有类型(说明是什么关系)。
  • 例如:节点[刘德华] ——(参演)——> 节点[流浪地球2]。

核心三:属性 (Property)

丰富数据的“细节”

无论是“节点”还是“关系”,都可以拥有自己的属性。


  • 属性以键值对 (Key-Value) 的形式存在(类似于 JSON)。
  • 节点的属性:[张三] 可以有年龄=20、性别=男等属性。
  • 关系的属性:[张三] 认识 [李四],关系是“认识”,关系的属性可以是“认识时间=2022年”。

核心四:标签 (Label)

给节点“分类贴条”

标签是用来对节点进行分组和归类的。


  • 就相当于传统数据库中的表名
  • 一个节点可以有多个标签!
  • 例如:张三的标签可以是 Person(人),同时也可以是 Student(学生)。

第二站:初识 Cypher

和 Neo4j 沟通的官方语言。
一门“画画”一般的编程语言!

什么是 Cypher?

图数据库的“SQL”

就像关系型数据库听得懂 SQL 语句(SELECT, INSERT)一样,Neo4j 听得懂的话就叫 Cypher


Cypher 是一种声明式图数据库查询语言。它的设计初衷就是为了让人类和电脑都能直观地理解图数据

为什么要叫这个名字?

Cypher(赛弗)的名字来源于电影《黑客帝国》中的角色。

特点:

  • 声明式:告诉数据库你要“什么”,而不是告诉它“怎么找”。
  • 表达力强:专门为表示图形模式而生。

Cypher 的核心魔法:ASCII 艺术

Cypher 最独特的地方在于,它的代码长得像颜文字(ASCII 艺术)。它用键盘上的符号直接“画”出图形!

  • 使用圆括号表示节点:( ) 像不像一个圆圈?
  • 使用方括号表示关系:[ ] 像不像一座桥?
  • 使用箭头表示方向:--><--

感受一下这门语言的直观性

如果要表示:“一个叫张三的人,认识一个叫李四的人”。
Cypher 代码长这样:

(张三) -[认识]-> (李四)

(张三)
圆括号代表节点

-[认识]->
箭头和方括号代表带方向的关系

(李四)
圆括号代表目标节点

第三站:Cypher 数据类型与规范

磨刀不误砍柴工。
在写代码前,先了解它的基本规则。

Cypher 数据类型三大类

Cypher 中的数据类型可以分为三大类,就像我们生活中的不同物资:

属性类型

最基础的值,可以存入节点和关系的属性中。

结构类型

代表图结构本身的类型(节点、关系等)。

复合类型

用来把多个数据打包在一起的类型。

第一类:属性类型 (Property Types)

可以直接存储的值

  • Number(数字):分为 Integer(整数) 和 Float(浮点数/小数)。比如年龄 20,身高 1.75。
  • String(字符串):文本数据,用单引号 ' ' 或双引号 " " 包裹。比如 "张三"
  • Boolean(布尔值):只有两个值,true(真)或 false(假)。
  • Point(空间点):地理位置坐标。
  • Temporal(时间):日期、时间等。

新手避坑指南

请注意!字符串必须加引号!

如果你写 name: 张三,程序会报错。必须写成 name: "张三" 或者 name: '张三'

而数字和布尔值千万不能加引号,加了就变成文字了!

第二类:结构类型 (Structural Types)

在查询过程中返回的图结构元素


  • Node(节点):包含了 id、标签和所有属性的一个完整实体。
  • Relationship(关系):包含了 id、类型、起点、终点和所有属性的一条边。
  • Path(路径):由一系列交替的节点和关系组成的路线。例如:节点A -> 关系1 -> 节点B -> 关系2 -> 节点C,这整条线叫一个路径。

注意:结构类型不能作为属性保存!你不能把一个“节点”存进另一个“节点”的属性里。

第三类:复合类型 (Composite Types)

List (列表 / 数组)

把一组有顺序的数据打包在一起。

  • 使用方括号包裹,逗号隔开:
    [1, 2, 3]
  • 可以是字符串列表:
    ["苹果", "香蕉", "橘子"]
  • 小技巧:节点的属性可以是一个列表哦!比如张三的爱好属性:hobby: ["唱歌", "跳舞"]

Map (映射 / 字典)

由一组键值对(Key-Value)组成的集合。

  • 使用大括号包裹:
    {name: "李四", age: 22}
  • 大家看,这个结构是不是非常眼熟?没错,我们在定义节点属性的时候,本质上就是在写一个 Map!

特殊的存在:NULL (空值)

图数据库里的“不存在”

在 Cypher 中,null 表示缺失的或者未知的值。


  • 特性1:与 null 的任何算术运算(+ - * /)结果都是 null。
  • 特性2:图数据库是无模式(Schema-free)的。如果一个节点没有 age 属性,你强行查询它的 age,不会报错,只会返回 null
  • 这是和 MySQL 非常不同的一点,大家在后续写代码时要特别小心。

命名规范 (Naming Rules)

基本规则

我们在给变量、标签、关系类型起名字时,必须遵守规则:

  • 区分大小写!(Personperson 是两码事)
  • 必须以字母开头。
  • 可以包含数字,但不能以数字开头。
  • 不能包含空格或特殊符号(除下划线 _ 以外)。

遇到特殊名字怎么办?

万一非要用包含空格或者中文字符做名字怎么办?

可以使用反引号 ( ` ) 将名字包裹起来(键盘左上角 Esc 下面的键)。


例如:

`My Label Name`
`中国`

行业最佳实践 (Best Practices)

虽然规则允许你随便起名字,但在企业开发中,我们有不成文的约定,显得代码更专业:

节点标签 (Label)

使用首字母大写的驼峰命名法 (CamelCase)。

✅ Person, Vehicle, Company

关系类型 (Rel Type)

使用全大写+下划线 (UPPER_SNAKE_CASE)。

✅ KNOWS, ACTED_IN, IS_FRIEND_WITH

属性 & 变量 (Property & Var)

使用首字母小写的驼峰命名法 (camelCase)。

✅ firstName, age, publishDate

Cypher 保留关键字 (Keywords)

关键字就是 Cypher 系统内部征用的词汇,咱们自己起名字时要避开它们。


常见的操作关键字包括(也是我们稍后要重点学习的):

  • CREATE (创建)
  • MATCH (匹配/查询)
  • RETURN (返回)
  • WHERE (过滤)
  • DELETE (删除)
  • SET (更新)

(注:Cypher 关键字本身不区分大小写,但规范上我们习惯全部大写,以区分于数据。)

第四站:核心操作大演练

理论结合实际!
增、查、改、删,一段段代码拆解给你看。

CREATE:创建新数据

功能概述

CREATE 关键字用于向图数据库中插入新的节点、关系或路径。

就像女娲捏泥人一样,从无到有创造实体。

1. 创建一个最简单的“空白”节点

CREATE (n)

解析:
圆括号 () 代表这是一个节点。n 是一个临时起的变量名(代号),为了方便后续引用它。这个节点没有任何标签和属性,非常孤独。

CREATE:带标签创建

2. 创建带有标签的节点

刚才的空白节点没有任何分类,现在我们给它贴个标签(比如:人)。

CREATE (n:Person)

语法拆解:
冒号 : 后面的 Person 就是标签(Label)。
这句代码的意思是:创建一个节点,属于 Person 类,并暂时代称为 n。

CREATE:带属性创建

3. 创建既有标签,又有属性的完整节点

这是平时最常用的写法,直接把数据的详细内容塞进去(使用大括号 {} 写 Map)。

CREATE (n:Person {name: '张三', age: 20})

语法拆解:
节点代号:n
分类标签:Person
拥有两个属性:name 是字符串张三,age 是数字20。

CREATE:创建关系

4. 一次性创建两个节点,外加他们之间的关系

用箭头 -[]-> 连接两个节点!

CREATE (p1:Person {name: '张三'})-[r:KNOWS {since: 2020}]->(p2:Person {name: '李四'})
  • 代码执行后,数据库不仅会生成“张三”和“李四”两个节点...
  • 还会生成一条从张三指向李四的箭头(关系)。
  • 关系的类型叫 KNOWS(认识)。
  • 关系本身也有属性 since: 2020(从2020年开始认识)。

MATCH:查询的灵魂核心

功能概述

MATCH 类似于 SQL 中的 SELECT。
它是图数据库中最重要的命令!


作用:在整个庞大的图谱中,“匹配”出符合你画出形状的模式(Pattern)。

注意:MATCH 通常不能单独使用,必须搭配 RETURN 把结果返回出来。

1. 查询所有节点(慎用)

MATCH (n)
RETURN n

⚠️ 警告:这相当于 SELECT * FROM 所有表。如果公司数据库有上亿个节点,这条命令会让服务器卡死。平时练习时可以用。

MATCH:按标签和属性查询

2. 缩小范围精准查找

MATCH (n:Person {name: '张三'})
RETURN n
  • 第一步:在几亿个数据中,先找到属于 Person 标签的数据。
  • 第二步:在这些 Person 中,找到属性 name 等于 '张三' 的数据。
  • 第三步:把找到的结果装进变量 n 中,并通过 RETURN 交给用户。

MATCH:发挥“图”的威力!

3. 基于关系的图谱查询(解决六度人脉痛点)

需求:找到“张三”认识的所有的“朋友”。

MATCH (p1:Person {name: '张三'})-[r:KNOWS]->(friend:Person)
RETURN friend

这才是 Neo4j 真正强大的地方!无需连表(JOIN),直接像顺藤摸瓜一样:找到张三,顺着向外的 KNOWS 箭头,找到另一端的节点,并把那个节点命名为 friend 返回出来!

RETURN:返回结果集

你可以决定返回什么

不仅仅可以返回整个节点,还可以返回指定的属性。

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

通过小数点 . 就能提取具体的属性值,像表格一样返回。

使用 AS 起别名

为了让返回的表头更好看,可以用 AS 进行重命名。

MATCH (n:Person)
RETURN n.name AS 姓名, n.age AS 年龄

输出结果的列名就会变成中文的“姓名”和“年龄”。

LIMIT 和 SKIP:分页截断

控制返回的数据量

当你搜索出1万条数据,但网页一页只能显示10条时,就需要分页。


  • LIMIT (限制):只返回前 N 条数据。
  • SKIP (跳过):跳过前 N 条数据,从第 N+1 条开始返回。

LIMIT 和 SKIP 代码演示

只要前三条记录

MATCH (n:Person)
RETURN n.name
LIMIT 3

即使系统里有100个Person,也只输出前3个。

实现网页的“第二页”

MATCH (n:Person)
RETURN n.name
SKIP 10
LIMIT 10

跳过前10条,取接下来的10条(即第11-20条记录)。

DELETE:删除节点与关系

基本删除法则

要删除数据,必须先 MATCH 找到它,然后再 DELETE 它。

MATCH (n:Person {name: '张三'})
DELETE n

坑点警告!

如果“张三”身上还连着和其他人的“关系线”,上面这行代码会直接报错失败!
Neo4j 决不允许出现一端悬空的孤立关系!

DETACH DELETE:强制拔除

最常用的彻底删除法

为了解决节点连着关系无法删除的问题,Cypher 提供了一个组合拳:DETACH DELETE(分离并删除)。

MATCH (n:Person {name: '张三'})
DETACH DELETE n

执行逻辑:系统会像剪刀一样,先咔嚓剪断“张三”身上的所有关系线,然后再把“张三”这个节点销毁,干脆利落。

REMOVE:移除属性与标签

DELETE vs REMOVE

同学们经常搞混这两个词:

  • DELETE 是用来删“实体”的(把整个节点或整条关系彻底删掉)。
  • REMOVE 是用来擦除“局部”的(实体还在,只是撕掉它身上的标签,或者擦掉它的某个属性)。

移除属性演示

MATCH (n:Person {name: '张三'})
REMOVE n.age
RETURN n

这行代码执行后,张三这个节点还在,他的名字也还在,只是“age(年龄)”这个属性被永远删除了。

WHERE:复杂条件过滤

当 {} 不够用的时候

我们在 MATCH 时可以用 {age: 20} 来找20岁的人。但如果我要找“大于20岁”的人呢?大括号就做不到了。


这时候就要请出 WHERE 从句:

MATCH (n:Person)
WHERE n.age > 20
RETURN n.name, n.age

WHERE 的常用操作符

比较运算

=, <>, <, >, <=, >=

例:WHERE n.age >= 18
(注:不等于用 <>)

布尔逻辑

AND, OR, XOR, NOT

例:WHERE n.age>18 AND n.gender='男'

字符串匹配

STARTS WITH
ENDS WITH
CONTAINS

例:WHERE n.name STARTS WITH '张'
(查找所有姓张的人)

SET:更新或添加数据

数据修改器

SET 关键字用来更新现有的节点或关系。

  • 如果属性已存在,SET 会修改它的值。
  • 如果属性不存在,SET 会新增这个属性。
  • 它还可以用来给节点新增标签!
MATCH (n:Person {name: '张三'})
SET n.age = 21, n.status = '在校'
RETURN n

SET:追加多重标签

一个人可以有多重身份

通过 SET,我们可以动态地给已经存在的节点贴上新的标签(使用冒号 :)。

MATCH (n:Person {name: '张三'})
SET n:Student:Monitor
RETURN n

执行后:张三不仅拥有原本的 Person 标签,又多出了 Student(学生)和 Monitor(班长)两个新标签!这就是无模式数据库的灵活性。

本节课核心知识大盘点

1. 图结构基础

  • 节点 (Node): 实体数据,用 () 表示
  • 关系 (Rel): 连接实体,用 -[]-> 表示
  • 属性 (Prop): 详细信息,用 {} 表示
  • 标签 (Label): 分类标识,用 : 表示

2. 语法与规范

  • 属性类型: 字符串必须加引号,数字不加
  • 结构类型: 节点、关系、路径 (不能存为属性)
  • 命名习惯: 标签用首字母大写,关系用全大写
  • 空值特性: 图数据库无模式,找不到即为 NULL

3. 核心操作 (增与查)

  • CREATE: 创造实体,从无到有建立节点和关系
  • MATCH: 查询灵魂,按照设定的模式顺藤摸瓜
  • RETURN: 决定将什么数据(或属性)打包返回

4. 核心操作 (改与删)

  • WHERE: 配合 MATCH,进行大小于、多条件过滤
  • SET: 数据修改器,用于更新属性或追加新标签
  • DELETE: 彻底销毁。(带关系的需用 DETACH DELETE)

理论就讲到这里!

下节课我们将进行上机实操,请大家做好准备!

有什么疑问随时提问,谢谢大家!