一、什么是图数据库?为什么用 Neo4j?
1.1 什么是图数据库?
图数据库(Graph Database)是一种专门用于存储和处理图结构数据的 NoSQL 数据库。它以节点(Node) 和 关系(Relationship) 为核心建模元素,非常适合表示实体之间的复杂连接关系。
- 节点:代表现实世界中的实体(如人、产品、地点等)。
- 关系:代表节点之间的连接(如“朋友”、“购买”、“位于”等),且关系本身也可以携带属性。
- 与传统的关系型数据库不同,图数据库不依赖于表和外键,而是直接将关系作为一等公民进行存储和查询。
1.2 为什么选择 Neo4j?
Neo4j 是目前最流行、功能最完善的原生图数据库之一,具有以下优势:
- ✅ 原生图存储引擎:专为图结构优化,性能卓越。
- ✅ 直观的查询语言 Cypher:类似自然语言,易学易用。
- ✅ 强大的可视化能力:通过浏览器界面可直接查看图结构。
- ✅ 活跃的社区和丰富的文档:适合初学者快速上手。
- ✅ 支持 ACID 事务:保证数据一致性。
- ✅ 开源版本免费:Neo4j Community Edition 可用于开发和小规模生产。
典型应用场景包括:
- 社交网络分析
- 推荐系统
- 欺诈检测
- 知识图谱构建
- 网络与 IT 运维拓扑管理
二、安装 Neo4j(推荐 v5.x)
本教程以 Neo4j Community Server v5.x 为例(适用于 Windows / macOS / Linux)。
2.1 下载 Neo4j
- 访问官方下载页面:https://neo4j.com/download-center/
- 选择 Neo4j Community Edition(注意选择 v5.x 版本,如 5.18)
- 根据你的操作系统下载对应安装包:
- Windows:
.exe安装程序 - macOS:
.dmg或使用 Homebrew - Linux:
.tar.gz压缩包
- Windows:
2.2 安装方式(以 Linux/macOS 为例)
# 解压(Linux/macOS)
tar -xf neo4j-community-5.x.x-unix.tar.gz
cd neo4j-community-5.x.x
# 启动服务(首次启动会提示接受许可协议)
bin/neo4j console
💡 Windows 用户:运行
.exe安装程序后,可通过开始菜单启动 Neo4j 服务。
2.3 初始配置
首次启动后,Neo4j 会要求你设置初始密码(默认用户名为 neo4j)。请记住该密码,后续登录浏览器界面时需要使用。
三、启动浏览器界面(http://localhost:7474)
- 确保 Neo4j 服务正在运行。
- 打开浏览器,访问:http://localhost:7474
- 首次登录时:
- Connect URL:
bolt://localhost:7687 - Username:
neo4j - Password: 你设置的初始密码
- Connect URL:
- 登录成功后,你会看到 Neo4j Browser 界面,包含:
- 查询编辑区(顶部)
- 结果展示区(中间)
- 图形可视化面板(可切换为表格/文本视图)
✅ 小技巧:在查询框中输入
:play movies并回车,可加载一个示例电影数据库进行练习!
四、核心概念
4.1 节点(Node)
- 表示实体,如一个人、一本书、一个城市。
- 可以拥有多个 标签(Label) 来分类(如
:Person,:Movie)。 - 可以包含 属性(Property)(键值对,如
{name: "Alice", age: 30})。
4.2 关系(Relationship)
- 连接两个节点,具有方向性(A → B)。
- 必须有 类型(Type)(如
:FRIENDS_WITH,:ACTED_IN)。 - 也可以拥有属性(如
{since: 2020})。
4.3 属性(Property)
- 键值对(key-value),存储在节点或关系上。
- 值可以是字符串、数字、布尔值、列表等(Neo4j 不支持嵌套对象)。
4.4 标签(Label)
- 用于对节点进行分组(类似关系型数据库中的“表名”)。
- 一个节点可以有多个标签(如
(:User:Admin))。 - 不能用于关系。
📌 示例图结构:
(Alice:Person {name:"Alice"}) -[:FRIENDS_WITH {since:2020}]-> (Bob:Person {name:"Bob"})
():表示一个节点。Alice:这是该节点的变量名(或别名),在查询中可用于引用该节点(例如在RETURN Alice中)。它不是存储在数据库中的数据,仅在当前查询上下文中有效。:Person:这是节点的标签(Label)。标签用于对节点进行分类,类似于关系型数据库中的“表名”。一个节点可以有多个标签(如:Person:User),但这里只有一个:Person。{name:"Alice"}:这是节点的属性(Properties),以键值对形式存在。这里表示该节点有一个属性name,其值为"Alice"。
-和->:表示有向关系,箭头方向从左(Alice)指向右(Bob)。如果写成-[:FRIENDS_WITH]-(无箭头),则表示无向(在匹配时忽略方向)。[:FRIENDS_WITH]:- 方括号
[]表示一个关系; :FRIENDS_WITH是关系的类型(Type)。关系必须有且仅有一个类型(不能像节点那样有多个标签,类型都是自定义的,无系统默认关系,建议大写加下划线,比如此处可以改为FRIENDS)。
- 方括号
{since:2020}:这是关系的属性。表示这段友谊从 2020 年开始。
五、Cypher 基础语法
Cypher 是 Neo4j 的声明式图查询语言,语法简洁直观。
5.1 常用关键字
| 关键字 | 作用说明 |
|---|---|
CREATE |
创建节点或关系 |
MATCH |
匹配图中的模式(类似 SQL 的 SELECT) |
RETURN |
返回查询结果 |
WHERE |
添加过滤条件 |
SET |
更新节点或关系的属性 |
DELETE |
删除节点或关系(注意:删除节点前需先删除其所有关系) |
5.2 基础操作示例
示例 1:创建一个带属性的节点
CREATE (:Person {name: "Alice"}); :Person 是标签 {name: "Alice"} 是属性
示例 2:创建两个节点并建立关系
CREATE (a:Person {name: "Alice"}), (b:Person {name: "Bob"}), (a)-[:FRIENDS_WITH {since: 2020}]->(b);
示例 3:查询所有 Person 节点
MATCH (p:Person) RETURN p;
示例 4:查找名字为 "Alice" 的人
MATCH (p:Person {name: "Alice"}) RETURN p;
示例 5:使用 WHERE 过滤
MATCH (p:Person) WHERE p.name = "Alice" RETURN p.name, p.age;
示例 6:更新属性
MATCH (p:Person {name: "Alice"}) SET p.age = 30 RETURN p;
示例 7:删除关系(先匹配再删)
MATCH (a:Person)-[r:FRIENDS_WITH]->(b:Person) WHERE a.name = "Alice" AND b.name = "Bob" DELETE r;
示例 8:删除节点(必须先删关系!)
MATCH (p:Person {name: "Alice"}) DETACH DELETE p; // DETACH 会自动删除所有关联关系
⚠️ 注意:普通
DELETE不能删除仍有关系的节点,必须使用DETACH DELETE。
浙公网安备 33010602011771号