我们来系统地讲解一下图数据库 Neo4j 的安装、部署和使用。这是一个从零开始的完整指南,涵盖了最核心和实用的部分。
Neo4j 简介
Neo4j 是世界领先的、原生的图数据库。它使用图(Graph)相关的概念来存储和操作数据,而不是传统的表结构。
- 核心概念:
- 节点(Node): 代表实体,例如一个人、一本书、一个部门。可以带有标签(Label)和属性(Properties)。
- 关系(Relationship): 连接两个节点,代表它们之间的关联。关系是有方向 的,并且必须有类型(Type),也可以带有属性。
- 属性(Properties): 键值对,用于描述节点或关系的特征。
- 标签(Label): 对节点进行分组,类似于关系型数据库中的表。
- 优点:
- 非常擅长处理高度互联的数据。
- 查询复杂关系路径时,性能远超传统关系型数据库。
- 使用直观的 Cypher 查询语言,易于理解和编写。
第一部分:离线安装部署
1. 下载离线安装包
访问 Neo4j 官网下载中心:
https://neo4j.com/download-center/#community
选择 "Linux / Unix (tar)" 格式的社区版下载。这会得到一个类似 neo4j-community-5.x.x-unix.tar.gz 的压缩包。

2. 传输和解压
将安装包上传到目标服务器,然后解压:
bash
# 解压到当前目录
tar -xzf neo4j-community-5.x.x-unix.tar.gz
# 移动到合适的安装目录
sudo mv neo4j-community-5.x.x /opt/neo4j
3. 创建专用用户(推荐)
bash
# 创建neo4j用户
sudo useradd -M -s /bin/bash neo4j
# 更改安装目录所有者
sudo chown -R neo4j:neo4j /opt/neo4j
4. 设置环境变量
bash
# 编辑profile文件
sudo vim /etc/profile
# 添加以下内容
export NEO4J_HOME=/opt/neo4j
export PATH=$PATH:$NEO4J_HOME/bin
# 使配置生效
source /etc/profile
第二部分:配置数据库存储目录
1. 主要配置文件
Neo4j 的主要配置文件是:
/opt/neo4j/conf/neo4j.conf
2. 配置数据存储目录
bash
# 编辑配置文件
sudo vim /opt/neo4j/conf/neo4j.conf
找到并修改以下关键配置:
properties
# 数据文件目录(节点、关系、属性等)
server.directories.data=/opt/neo4j/data
# 日志文件目录
server.directories.logs=/opt/neo4j/logs
# 导入文件目录(用于LOAD CSV等操作)
server.directories.import=/opt/neo4j/import
# 插件目录
server.directories.plugins=/opt/neo4j/plugins
# 事务日志目录
server.directories.transaction.logs.root=/opt/neo4j/data/transactions
3. 创建目录并设置权限
bash
# 创建所有必要的目录
sudo mkdir -p /opt/neo4j/{data,logs,import,plugins}
# 如果使用自定义目录,比如 /data/neo4j
sudo mkdir -p /data/neo4j/{data,logs,import,plugins}
# 设置权限
sudo chown -R neo4j:neo4j /opt/neo4j
# 或者如果是自定义目录
sudo chown -R neo4j:neo4j /data/neo4j
4. 其他重要存储配置
properties
# 默认数据库名称
server.default_database=neo4j
# 是否允许升级现有数据库
server.allow_upgrade=true
第三部分:修改数据库账号密码
方法一:通过 Cypher 命令修改(推荐)
- 启动 Neo4j 服务
bash
# 切换到neo4j用户
sudo -u neo4j /opt/neo4j/bin/neo4j start
- 访问 Cypher Shell
bash
# 使用默认密码登录(初始密码通常是 neo4j)
/opt/neo4j/bin/cypher-shell -u neo4j -p neo4j
- 修改密码
cypher
# 在cypher-shell中执行
ALTER CURRENT USER SET PASSWORD FROM 'neo4j' TO 'YourNewPassword123';
- 退出
cypher
:exit
方法二:通过配置文件重置(忘记密码时)
- 停止 Neo4j 服务
bash
sudo -u neo4j /opt/neo4j/bin/neo4j stop
- 启用密码重置
编辑配置文件:
bash
sudo vim /opt/neo4j/conf/neo4j.conf
添加或修改:
properties
# 启用初始化密码重置
server.initial.dbms.default_password=neo4j
dbms.security.auth_enabled=false
- 启动服务并重置密码
bash
# 启动服务
sudo -u neo4j /opt/neo4j/bin/neo4j start
# 连接并重置密码
/opt/neo4j/bin/cypher-shell -u neo4j -p neo4j
ALTER CURRENT USER SET PASSWORD FROM 'neo4j' TO 'YourNewPassword123';
- 恢复安全设置
重新编辑配置文件,注释掉或删除刚才添加的行:
properties
# server.initial.dbms.default_password=neo4j
# dbms.security.auth_enabled=false
- 重启服务
bash
sudo -u neo4j /opt/neo4j/bin/neo4j restart
第四部分:完整部署流程示例
1. 完整安装脚本
bash
#!/bin/bash
# 解压安装包
tar -xzf neo4j-community-5.x.x-unix.tar.gz
sudo mv neo4j-community-5.x.x /opt/neo4j
# 创建用户
sudo useradd -M -s /bin/bash neo4j
# 创建目录结构
sudo mkdir -p /opt/neo4j/{data,logs,import,plugins,run}
# 设置权限
sudo chown -R neo4j:neo4j /opt/neo4j
# 备份原始配置
sudo cp /opt/neo4j/conf/neo4j.conf /opt/neo4j/conf/neo4j.conf.backup
2. 最小化配置文件
bash
sudo -u neo4j nano /opt/neo4j/conf/neo4j.conf
properties
# 服务器配置
server.mode=SINGLE
server.default_listen_address=0.0.0.0
server.memory.pagecache.size=1G
server.memory.heap.initial_size=1G
server.memory.heap.max_size=2G
# 目录配置
server.directories.data=/opt/neo4j/data
server.directories.logs=/opt/neo4j/logs
server.directories.import=/opt/neo4j/import
server.directories.plugins=/opt/neo4j/plugins
# 连接配置
server.bolt.enabled=true
server.bolt.tls_level=OPTIONAL
server.bolt.listen_address=:7687
server.http.enabled=true
server.http.listen_address=:7474
# 安全配置
server.security.auth_enabled=true
3. 启动和测试
bash
# 启动服务
sudo -u neo4j /opt/neo4j/bin/neo4j start
# 检查状态
sudo -u neo4j /opt/neo4j/bin/neo4j status
# 测试连接(在另一终端)
/opt/neo4j/bin/cypher-shell -u neo4j -p neo4j
4. 创建系统服务(可选)
bash
sudo vim /etc/systemd/system/neo4j.service
ini
[Unit]
Description=Neo4j Graph Database
After=network.target
[Service]
Type=forking
User=neo4j
Group=neo4j
ExecStart=/opt/neo4j/bin/neo4j start
ExecStop=/opt/neo4j/bin/neo4j stop
ExecReload=/opt/neo4j/bin/neo4j restart
Restart=on-failure
LimitNOFILE=60000
TimeoutSec=120
[Install]
WantedBy=multi-user.target
启用服务:
bash
sudo systemctl daemon-reload
sudo systemctl enable neo4j
sudo systemctl start neo4j
方法二:Docker 版 - 适用于开发和生产
这种方式灵活、干净,易于版本管理和部署。
-
拉取镜像
bashdocker pull neo4j:latest -
运行容器
bashdocker run \ --name my-neo4j \ -p 7474:7474 -p 7687:7687 \ -v /path/on/your/host/data:/data \ -v /path/on/your/host/logs:/logs \ -v /path/on/your/host/import:/var/lib/neo4j/import \ -d \ --env NEO4J_AUTH=neo4j/your_password \ neo4j:latest-p 7474:7474:映射 HTTP 端口,用于访问 Neo4j Browser。-p 7687:7687:映射 Bolt 端口,用于应用程序连接。-v ...:/data:数据持久化到宿主机。-v ...:/logs:日志持久化。-v ...:/import:方便你从宿主机导入 CSV 等文件。--env NEO4J_AUTH=neo4j/your_password:设置默认用户neo4j的密码。
-
访问
- 在浏览器中打开
http://localhost:7474。 - 输入用户名
neo4j和你设置的密码your_password进行连接。
- 在浏览器中打开
第五部分:验证和故障排查
验证部署
- 检查服务状态:
bash
/opt/neo4j/bin/neo4j status
- 检查端口监听:
bash
netstat -tlnp | grep -E '(7474|7687)'
- 测试Web访问 :
浏览器访问http://服务器IP:7474
常见问题排查
- 权限问题:
bash
# 确保所有文件属于neo4j用户
sudo chown -R neo4j:neo4j /opt/neo4j
- 端口冲突:
bash
# 检查端口占用
lsof -i :7474
lsof -i :7687
- 内存不足 :
调整neo4j.conf中的内存设置:
properties
server.memory.heap.initial_size=512m
server.memory.heap.max_size=1G
server.memory.pagecache.size=512m
第六部分:基本使用与 Cypher 入门
成功连接 Neo4j Browser 后,你会看到一个命令输入界面。我们将使用 Cypher 语言进行操作。
1. 创建数据(CREATE)
创建节点:
cypher
// 创建带有 'Person' 标签的节点,并设置属性
CREATE (you:Person {name: 'You', age: 30, from: 'China'})
// 一次创建多个节点
CREATE (alice:Person {name: 'Alice', age: 25}),
(bob:Person {name: 'Bob', age: 35})
创建关系:
cypher
// 找到两个节点,并在它们之间创建关系
MATCH (you:Person {name: 'You'})
MATCH (alice:Person {name: 'Alice'})
CREATE (you)-[:FRIENDS_WITH {since: '2023-01-01'}]->(alice)
// 更简洁的写法,在创建关系的同时定义节点
CREATE (you:Person {name: 'You'})-[:LIKES]->(movie:Movie {title: 'The Matrix'})
2. 查询数据(MATCH)
查询所有节点和关系:
cypher
MATCH (n) RETURN n
这会返回一个可视化的图。
查询特定节点:
cypher
// 查询所有 'Person' 节点
MATCH (p:Person) RETURN p
// 查询名字是 'Alice' 的 'Person'
MATCH (p:Person {name: 'Alice'}) RETURN p
查询关系:
cypher
// 查询 'You' 的所有朋友
MATCH (you:Person {name: 'You'})-[:FRIENDS_WITH]->(friend)
RETURN friend.name
// 查询谁喜欢 'The Matrix' 这部电影
MATCH (person)-[:LIKES]->(movie:Movie {title: 'The Matrix'})
RETURN person.name
3. 更新数据(SET)
cypher
// 为 'You' 节点添加一个 'city' 属性
MATCH (you:Person {name: 'You'})
SET you.city = 'Beijing'
RETURN you
4. 删除数据(DELETE)
注意: 删除节点前,必须先删除与其相连的所有关系。
cypher
// 删除 'Bob' 节点(以及他所有的关系)
MATCH (bob:Person {name: 'Bob'})
DETACH DELETE bob
// 只删除关系,保留节点
MATCH (you:Person {name: 'You'})-[r:FRIENDS_WITH]->(alice:Person {name: 'Alice'})
DELETE r
第四部分:电影示例(经典入门案例)
让我们在 Neo4j Browser 中运行一个完整的例子。
-
清空数据库(可选,确保从空库开始):
cypherMATCH (n) DETACH DELETE n -
创建电影图景:
cypher// 创建演员和导演节点 CREATE (Keanu:Person {name: 'Keanu Reeves', born: 1964}) CREATE (Carrie:Person {name: 'Carrie-Anne Moss', born: 1967}) CREATE (Laurence:Person {name: 'Laurence Fishburne', born: 1961}) CREATE (Hugo:Person {name: 'Hugo Weaving', born: 1960}) CREATE (LillyW:Person {name: 'Lilly Wachowski', born: 1967}) CREATE (LanaW:Person {name: 'Lana Wachowski', born: 1965}) // 创建电影节点 CREATE (TheMatrix:Movie {title: 'The Matrix', released: 1999, tagline: 'Welcome to the Real World'}) // 创建关系:谁演了什么角色,谁导演了电影 CREATE (Keanu)-[:ACTED_IN {roles: ['Neo']}]->(TheMatrix) CREATE (Carrie)-[:ACTED_IN {roles: ['Trinity']}]->(TheMatrix) CREATE (Laurence)-[:ACTED_IN {roles: ['Morpheus']}]->(TheMatrix) CREATE (Hugo)-[:ACTED_IN {roles: ['Agent Smith']}]->(TheMatrix) CREATE (LillyW)-[:DIRECTED]->(TheMatrix) CREATE (LanaW)-[:DIRECTED]->(TheMatrix) -
执行查询:
-
查询整个图:
cypherMATCH (n) RETURN n你将看到一个漂亮的网络图。
-
找到 "The Matrix" 的所有演员:
cypherMATCH (movie:Movie {title: 'The Matrix'})<-[:ACTED_IN]-(actor) RETURN actor.name -
找到 "Keanu Reeves" 合作过的所有导演:
cypherMATCH (keanu:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director) RETURN director.name
-
备份和恢复 Neo4j 数据库。
备份 Neo4j 数据库
Neo4j 提供了 neo4j-admin 工具来进行数据库备份。以下是备份命令的基本格式:
bash
neo4j-admin backup --backup-dir= --name=
例如:
bash
neo4j-admin backup --backup-dir=/var/backups/neo4j --name=neo4j-backup
恢复 Neo4j 数据库
恢复 Neo4j 数据库也需要使用 neo4j-admin 工具。以下是恢复命令的基本格式:
bash
neo4j-admin restore --from=/ --database= --force=true
例如:
bash
neo4j-admin restore --from=/var/backups/neo4j/neo4j-backup --database=graph.db --force=true
完整示例
- 备份数据库
假设你的 Neo4j 服务器正在运行并且你希望将其数据备份到本地磁盘上的某个目录中,可以按照以下步骤操作: - 打开终端或命令行界面。
- 运行备份命令:
bash
neo4j-admin backup --backup-dir=/var/backups/neo4j --name=neo4j-backup
-
检查备份文件:
运行上述命令后,你会在指定的备份目录(在这个例子中是/var/backups/neo4j)找到一个名为neo4j-backup的子目录,其中包含了备份的数据文件。 -
恢复数据库
假设你想从刚才创建的备份中恢复数据库,可以按照以下步骤操作: -
停止 Neo4j 服务:
在恢复之前,必须先停止正在运行的 Neo4j 服务以防止数据损坏。bashsudo systemctl stop neo4j -
运行恢复命令:
bashneo4j-admin restore --from=/var/backups/neo4j/neo4j-backup --database=graph.db --force=true这里的
--force=true参数表示如果目标数据库已经存在,则强制覆盖它。 -
启动 Neo4j 服务:
bashsudo systemctl start neo4j
注意事项
- 权限:确保运行备份和恢复命令的用户有足够的权限访问目标备份目录和数据库目录。
- 服务状态:在执行恢复操作之前,必须先停止正在运行的 Neo4j 服务。
- 网络配置:如果你是在远程机器上运行备份和恢复命令,请确保防火墙和网络配置允许从备份客户端到 Neo4j 服务器的通信。
通过以上步骤,你可以成功地备份和恢复 Neo4j 数据库。
:进阶与生产部署建议
-
驱动与编程 :
Neo4j 官方提供了多种语言的驱动,如 Java, Python, JavaScript, .NET, Go 等。你可以在应用程序中通过这些驱动连接并操作 Neo4j。
-
Python 示例 :使用
neo4j驱动包。pythonfrom neo4j import GraphDatabase driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "your_password")) def get_friends_of(tx, name): result = tx.run(""" MATCH (p:Person {name: $name})-[:FRIENDS_WITH]->(friend) RETURN friend.name """, name=name) return [record["friend.name"] for record in result] with driver.session() as session: friends = session.execute_read(get_friends_of, "You") print(friends) driver.close()
-
-
生产部署:
- Neo4j AuraDB:官方托管的云服务,无需运维,开箱即用,是最省心的生产环境选择。
- Neo4j Enterprise:企业版,支持因果集群,提供高可用、横向扩展和高级安全功能。可以部署在自有服务器或云虚拟机(如 AWS EC2)上。
- 配置优化 :调整内存设置(如
dbms.memory.heap.initial_size和dbms.memory.pagecache.size)对于生产性能至关重要。
总结
图数据库的强大之处在于探索关系,当你处理社交网络、推荐系统、知识图谱、供应链、风控等涉及复杂关系的场景时,Neo4j 会展现出巨大的优势。记得在生产环境中使用强密码,并定期备份数据。