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 安装指南)
 - 
执行命令 :
bash# 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)
            
            
              cypher
              
              
            
          
          # 创建用户"张三"(属性: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 入门"帖子加"发布"关系
            
            
              cypher
              
              
            
          
          # 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:查询所有用户节点(显示姓名和年龄)
            
            
              cypher
              
              
            
          
          MATCH (u:User)
RETURN u.name AS 用户名, u.age AS 年龄;
        示例2:查询"张三"关注的人(显示关注关系)
            
            
              cypher
              
              
            
          
          MATCH (u1:User {name: "张三"})-[:FOLLOWS]->(u2:User)
RETURN u1.name AS 关注者, u2.name AS 被关注者;
        示例3:查询"张三"发布的帖子(显示完整图结构)
            
            
              cypher
              
              
            
          
          MATCH (u:User {name: "张三"})-[:PUBLISHED]->(p:Post)
RETURN u, p;  # 返回节点和关系,Graph 模式会显示连线
        (4)更新数据(SET)
语法:MATCH (节点) WHERE 条件 SET 节点.属性 = 新值
示例:将"张三"的年龄改为29,给帖子加"阅读量"属性
            
            
              cypher
              
              
            
          
          # 更新张三的年龄
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:删除"张三"关注李四的关系
            
            
              cypher
              
              
            
          
          # 先匹配关系,再删除
MATCH (u1:User {name: "张三"})-[:FOLLOWS]->(u2:User {name: "李四"})
DELETE u1-[:FOLLOWS]->u2;
        示例2:删除"Neo4j 入门"帖子节点(需先删关联的发布关系)
            
            
              cypher
              
              
            
          
          # 1. 删除帖子关联的所有关系
MATCH (u:User)-[r:PUBLISHED]->(p:Post {title: "Neo4j 入门"})
DELETE r;
# 2. 删除帖子节点
MATCH (p:Post {title: "Neo4j 入门"})
DELETE p;
        示例3:删除"张三"的"gender"属性
            
            
              cypher
              
              
            
          
          MATCH (u:User {name: "张三"})
REMOVE u.gender;
# 验证:查询张三的属性,已无 gender
MATCH (u:User {name: "张三"})
RETURN u;
        2. 进阶功能:索引与约束(提升查询效率)
当数据量较大时,需通过「索引」加速查询,通过「约束」保证数据唯一性。
(1)创建索引(针对节点属性)
语法:CREATE INDEX 索引名 FOR (n:标签) ON (n.属性);
示例:给 User 标签的 name 属性创建索引(查询"按姓名找用户"时会更快)
            
            
              cypher
              
              
            
          
          # 创建索引
CREATE INDEX idx_user_name FOR (n:User) ON (n.name);
# 查看所有索引
SHOW INDEXES;
        (2)创建唯一约束(避免重复数据)
语法:CREATE CONSTRAINT 约束名 ON (n:标签) ASSERT n.属性 IS UNIQUE;
示例:保证 User 标签的 name 属性唯一(不能创建两个"张三"用户)
            
            
              cypher
              
              
            
          
          # 创建唯一约束
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(用户数据):csvname,age,gender 王五,30,男 赵六,25,女 - 
posts.csv(帖子数据):csvtitle,author,createTime Neo4j 索引学习,王五,2024-10-02 Cypher 高级用法,赵六,2024-10-03 
步骤2:导入 CSV 数据
- 
本地文件导入 :将 CSV 文件放在 Neo4j 的「import」目录下(Desktop 中,数据库右键→「Open Folder」→「import」;Docker 中,挂载的
data目录同级有import目录); - 
执行导入命令 :
cypher# 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」):inidbms.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,直接登录(无需密码),执行命令重置密码:cypherALTER USER neo4j SET PASSWORD '新密码'; - 
重置后改回
dbms.security.auth_enabled=true,重启数据库。 
 - 
 - 
查询速度慢?
- 检查是否创建索引:执行 
SHOW INDEXES,确认查询条件中的属性已建索引; - 用 
EXPLAIN分析执行计划:在查询语句前加EXPLAIN,查看是否有"AllNodesScan"(全节点扫描,需优化)。 
 - 检查是否创建索引:执行 
 
五、后续学习资源
- 官方文档 :Neo4j 官方指南(最权威,含 Cypher 语法、高级功能);
 - APOC 插件:Neo4j 官方工具库(支持更多数据导入、图算法等),Desktop 中数据库→「Plugins」→安装「APOC Core」即可使用;
 - 图算法:Neo4j 支持最短路径、社区发现等算法,需安装「Graph Data Science Library」插件。