Neo4j图数据库上手指南
Neo4j 是主流的原生图数据库,核心用于存储和查询“节点-关系-属性”构成的图数据。
本指南从环境搭建到核心功能实操,提供可直接执行的步骤和命令,确保对于新手能快速上手并实现核心功能。
版本说明:本指南基于 Neo4j 5.15.0 编写,适用于 Neo4j 4.x-5.x 版本,语法在社区版和企业版均适用。
一、环境准备:安装 Neo4j(3种主流方式)
1. 推荐:Neo4j Desktop(图形化管理,适合新手)
- 下载地址:Neo4j 官网(需注册,免费版足够入门)
- 安装步骤:
- 双击安装包,按提示完成安装(Windows/macOS 步骤一致,Linux 需通过 DEB/RPM 包安装);
- 打开 Neo4j Desktop,点击「New Project」创建项目(如“Neo4j-Demo”);
- 在项目内点击「Add Database」→ 选择「Create a Local Database」:
- 输入数据库名称(如“test-db”);
- 设置密码(记好,后续登录用);
- 版本选择「Community Edition」(免费社区版);
- 点击「Start」启动数据库,启动成功后点击「Open」进入浏览器界面。
2. 轻量:Docker 安装(适合有 Docker 基础的用户)
- 前提:已安装 Docker(Docker 安装指南)
- 执行命令:
# 1. 拉取 Neo4j 社区版镜像(最新稳定版) docker pull neo4j:latest# 2. 启动容器(映射端口+挂载数据卷,避免数据丢失) docker run -d \--name neo4j-demo \ # 容器名-p 7474:7474 \ # HTTP 端口(浏览器访问)-p 7687:7687 \ # Bolt 端口(Cypher 客户端连接)-v $HOME/neo4j/data:/data \ # 本地目录挂载到容器数据目录(Windows 替换为 -v C:/neo4j/data:/data)-e NEO4J_AUTH=neo4j/your-password \ # 初始用户名/密码(your-password 替换为你的密码)neo4j:latest
- 验证:打开浏览器访问
http://localhost:7474
,能看到登录界面即成功。
3. 传统:社区版压缩包安装(适合需要自定义配置的场景)
- 下载:Neo4j 社区版压缩包(选择对应系统的压缩包,如 Windows 选 zip,Linux 选 tar.gz);
- 解压:将压缩包解压到无中文/空格的目录(如 Windows:
D:\neo4j-community-5.15.0
,Linux:/opt/neo4j
); - 启动:
- Windows:进入
bin
目录,双击neo4j.bat
,再执行neo4j start
; - Linux/macOS:进入
bin
目录,执行./neo4j start
;
- Windows:进入
- 登录:浏览器访问
http://localhost:7474
,首次登录用默认账号neo4j
、密码neo4j
,会提示强制修改密码(改为你自己的密码)。
二、初识 Neo4j Browser(核心操作界面)
登录后看到的「Neo4j Browser」是官方图形化工具,核心区域如下:
- 命令输入框:输入 Cypher 语句(Neo4j 专用查询语言),按
Ctrl+Enter
执行; - 结果展示区:支持「Graph(图形)」「Table(表格)」「Text(文本)」3种展示方式,图形模式最直观;
- 左侧导航栏:
- 「Database Info」:查看数据库版本、节点/关系数量;
- 「Node Labels」:查看所有节点标签(类似“表名”);
- 「Relationship Types」:查看所有关系类型;
- 常用快捷命令:
:server status
:查看数据库状态;:clear
:清空命令输入框;:help
:查看 Cypher 语法帮助。
三、核心功能实操:Cypher 语言入门
Cypher 是 Neo4j 的核心操作语言,类似 SQL,但专为图数据设计。以下操作均在「命令输入框」执行,执行后可在「Graph」模式查看结果。
1. 基础操作:创建/查询/更新/删除(CRUD)
(1)创建节点(Node)
节点需带「标签」(Label,类似“表名”)和「属性」(Property,类似“字段”),语法:CREATE (:标签 {属性1: 值1, 属性2: 值2, ...})
示例:创建2个“用户”节点(标签:User)和1个“帖子”节点(标签:Post)
# 创建用户“张三”(属性:name、age、gender)
CREATE (:User {name: "张三", age: 28, gender: "男"});# 创建用户“李四”
CREATE (:User {name: "李四", age: 26, gender: "女"});# 创建帖子(属性:title、content、createTime)
CREATE (:Post {title: "Neo4j 入门", content: "今天学了 Cypher 基础", createTime: "2024-10-01"});
执行后,在「Graph」模式能看到3个独立节点(不同颜色代表不同标签)。
(2)创建关系(Relationship)
关系连接两个节点,需指定「关系类型」和可选属性,语法:MATCH (n:标签1), (m:标签2) WHERE 条件 CREATE (n)-[:关系类型 {属性}]->(m)
示例:给“张三”和“李四”加“关注”关系,给“张三”和“Neo4j 入门”帖子加“发布”关系
# 1. 张三关注李四(关系类型:FOLLOWS,属性:followTime)
MATCH (u1:User {name: "张三"}), (u2:User {name: "李四"})
CREATE (u1)-[:FOLLOWS {followTime: "2024-09-20"}]->(u2);# 2. 张三发布帖子(关系类型:PUBLISHED,属性:publishTime)
MATCH (u:User {name: "张三"}), (p:Post {title: "Neo4j 入门"})
CREATE (u)-[:PUBLISHED {publishTime: "2024-10-01"}]->(p);
执行后,「Graph」模式会显示节点间的连线(关系),鼠标悬停可看关系类型和属性。
(3)查询数据(MATCH + RETURN)
语法:MATCH (节点/关系模式) WHERE 过滤条件 RETURN 要展示的内容
示例1:查询所有用户节点(显示姓名和年龄)
MATCH (u:User)
RETURN u.name AS 用户名, u.age AS 年龄;
示例2:查询“张三”关注的人(显示关注关系)
MATCH (u1:User {name: "张三"})-[:FOLLOWS]->(u2:User)
RETURN u1.name AS 关注者, u2.name AS 被关注者;
示例3:查询“张三”发布的帖子(显示完整图结构)
MATCH (u:User {name: "张三"})-[:PUBLISHED]->(p:Post)
RETURN u, p; # 返回节点和关系,Graph 模式会显示连线
(4)更新数据(SET)
语法:MATCH (节点) WHERE 条件 SET 节点.属性 = 新值
示例:将“张三”的年龄改为29,给帖子加“阅读量”属性
# 更新张三的年龄
MATCH (u:User {name: "张三"})
SET u.age = 29;# 给帖子加阅读量属性
MATCH (p:Post {title: "Neo4j 入门"})
SET p.readCount = 100;# 验证更新结果
MATCH (u:User {name: "张三"}), (p:Post {title: "Neo4j 入门"})
RETURN u.age AS 张三年龄, p.readCount AS 帖子阅读量;
(5)删除数据(DELETE + REMOVE)
DELETE
:删除节点或关系(删除节点前必须先删除关联的关系,否则报错);REMOVE
:删除节点/关系的属性或标签。
示例1:删除“张三”关注李四的关系
# 先匹配关系,再删除
MATCH (u1:User {name: "张三"})-[:FOLLOWS]->(u2:User {name: "李四"})
DELETE u1-[:FOLLOWS]->u2;
示例2:删除“Neo4j 入门”帖子节点(需先删关联的发布关系)
# 1. 删除帖子关联的所有关系
MATCH (u:User)-[r:PUBLISHED]->(p:Post {title: "Neo4j 入门"})
DELETE r;# 2. 删除帖子节点
MATCH (p:Post {title: "Neo4j 入门"})
DELETE p;
示例3:删除“张三”的“gender”属性
MATCH (u:User {name: "张三"})
REMOVE u.gender;# 验证:查询张三的属性,已无 gender
MATCH (u:User {name: "张三"})
RETURN u;
2. 进阶功能:索引与约束(提升查询效率)
当数据量较大时,需通过「索引」加速查询,通过「约束」保证数据唯一性。
(1)创建索引(针对节点属性)
语法:CREATE INDEX 索引名 FOR (n:标签) ON (n.属性);
示例:给 User 标签的 name 属性创建索引(查询“按姓名找用户”时会更快)
# 创建索引
CREATE INDEX idx_user_name FOR (n:User) ON (n.name);# 查看所有索引
SHOW INDEXES;
(2)创建唯一约束(避免重复数据)
语法:CREATE CONSTRAINT 约束名 ON (n:标签) ASSERT n.属性 IS UNIQUE;
示例:保证 User 标签的 name 属性唯一(不能创建两个“张三”用户)
# 创建唯一约束
CREATE CONSTRAINT const_user_name_unique ON (n:User) ASSERT n.name IS UNIQUE;# 验证:尝试创建重复的“张三”用户,会报错
CREATE (:User {name: "张三", age: 30}); # 报错信息:Node(...) already exists with label User and property "name" = '张三'
3. 实用功能:数据导入(以 CSV 为例)
Neo4j 支持从 CSV/JSON 等文件导入数据,这里以最常用的 CSV 为例。
步骤1:准备 CSV 文件
创建两个 CSV 文件(注意编码为 UTF-8):
users.csv
(用户数据):name,age,gender 王五,30,男 赵六,25,女
posts.csv
(帖子数据):title,author,createTime Neo4j 索引学习,王五,2024-10-02 Cypher 高级用法,赵六,2024-10-03
步骤2:导入 CSV 数据
- 本地文件导入:将 CSV 文件放在 Neo4j 的「import」目录下(Desktop 中,数据库右键→「Open Folder」→「import」;Docker 中,挂载的
data
目录同级有import
目录); - 执行导入命令:
# 1. 从 users.csv 导入用户节点(若已存在则更新,用 MERGE 避免重复) LOAD CSV WITH HEADERS FROM "file:///users.csv" AS row MERGE (:User {name: row.name, age: toInteger(row.age), gender: row.gender});# 2. 从 posts.csv 导入帖子节点,并创建“发布”关系 LOAD CSV WITH HEADERS FROM "file:///posts.csv" AS row MATCH (u:User {name: row.author}) MERGE (p:Post {title: row.title, createTime: row.createTime}) MERGE (u)-[:PUBLISHED {publishTime: row.createTime}]->(p);# 验证导入结果 MATCH (u:User)-[:PUBLISHED]->(p:Post) RETURN u.name AS 作者, p.title AS 帖子标题;
四、常见问题与排查
-
浏览器访问
http://localhost:7474
无响应?- 检查数据库是否启动:执行
neo4j status
(压缩包)或docker ps
(Docker),确认服务在运行; - 端口冲突:若 7474/7687 端口被占用,修改配置文件
neo4j.conf
(压缩包在conf
目录,Desktop 中数据库右键→「Settings」):dbms.connector.http.port=7475 # 改 HTTP 端口为 7475 dbms.connector.bolt.port=7688 # 改 Bolt 端口为 7688
- 重启数据库后,访问
http://localhost:7475
。
- 检查数据库是否启动:执行
-
忘记密码?
- 压缩包/Docker:停止数据库,修改
neo4j.conf
中dbms.security.auth_enabled=false
,重启后访问http://localhost:7474
,直接登录(无需密码),执行命令重置密码:ALTER USER neo4j SET PASSWORD '新密码';
- 重置后改回
dbms.security.auth_enabled=true
,重启数据库。
- 压缩包/Docker:停止数据库,修改
-
查询速度慢?
- 检查是否创建索引:执行
SHOW INDEXES
,确认查询条件中的属性已建索引; - 用
EXPLAIN
分析执行计划:在查询语句前加EXPLAIN
,查看是否有“AllNodesScan”(全节点扫描,需优化)。
- 检查是否创建索引:执行
五、后续学习资源
- 官方文档:Neo4j 官方指南(最权威,含 Cypher 语法、高级功能);
- APOC 插件:Neo4j 官方工具库(支持更多数据导入、图算法等),Desktop 中数据库→「Plugins」→安装「APOC Core」即可使用;
- 图算法:Neo4j 支持最短路径、社区发现等算法,需安装「Graph Data Science Library」插件。