3、Neo4j图数据库入门:Neo4j安装与配置、Cypher查询语言基础、节点与关系的CRUD操作、索引与约束
好,咱们进入图数据库的世界。说实话,Neo4j是我个人最常用的图数据库,没有之一。当年我第一次接触知识图谱时,就被它的“节点-关系”模型震撼到了——这不就是现实世界最自然的映射方式吗?
这一章,咱们把Neo4j从安装到基本操作全部过一遍。你想想看,如果连数据库都不会装、不会查,那后面的知识图谱驱动问答系统就是空中楼阁。所以,咱们一步一个脚印来。
3.1 Neo4j安装与配置
安装Neo4j其实很简单,但有几个坑我得提前告诉你。我曾在项目中因为版本选错,折腾了一整天。
3.1.1 下载与安装
我个人习惯用社区版(Community Edition),免费且功能足够。企业版虽然多了集群和权限控制,但咱们做课程用社区版完全OK。
安装步骤:
- 访问Neo4j官网下载页面,选择对应操作系统的版本
- Windows用户下载exe安装包,Mac/Linux用户下载tar.gz压缩包
- 解压后,进入bin目录,执行启动命令
# Linux/Mac 启动命令
./neo4j start
# Windows 启动命令(在bin目录下)
neo4j.bat start
3.1.2 配置修改
默认配置下,Neo4j只允许本地访问。但咱们做开发时,经常需要远程连接。修改conf/neo4j.conf文件:
# 允许远程连接
dbms.default_listen_address=0.0.0.0
# 修改默认密码(可选)
dbms.security.auth_enabled=true
启动成功后,浏览器访问 http://localhost:7474,默认账号密码都是 neo4j。第一次登录会要求修改密码。
3.2 Cypher查询语言基础
Cypher是Neo4j的查询语言,说白了就是图数据库的SQL。但它的语法更直观——用圆括号表示节点,用方括号表示关系。
为什么会这样设计?因为图数据库的核心就是“节点-关系-节点”的三元组结构。Cypher用视觉化的方式,让你一眼就能看出查询意图。
3.2.1 基本语法结构
| 语法元素 | 表示方式 | 示例 |
|---|---|---|
| 节点 | (变量名:标签) | (p:Person) |
| 关系 | -[变量名:关系类型]-> | -[r:KNOWS]-> |
| 属性 | {属性名: 值} | {name: '张三'} |
| 模式 | (节点)-[关系]->(节点) | (p:Person)-[r:KNOWS]->(q:Person) |
// 最简单的查询:查找所有Person节点
MATCH (p:Person)
RETURN p
// 带条件的查询
MATCH (p:Person)
WHERE p.age > 30
RETURN p.name, p.age
3.2.2 常用Cypher命令
嗯,这里要注意:Cypher的命令不区分大小写,但标签和属性名是区分大小写的。我刚开始学的时候,就因为大小写问题查了半天数据都查不出来。
- MATCH:匹配模式,相当于SQL的SELECT
- RETURN:返回结果
- WHERE:过滤条件
- CREATE:创建节点或关系
- DELETE:删除节点或关系
- SET:更新属性
- MERGE:如果存在则匹配,不存在则创建
3.3 节点与关系的CRUD操作
咱们用金融知识图谱的场景来演示。假设我们要构建一个简单的“公司-投资-项目”图谱。
3.3.1 创建节点
// 创建单个节点
CREATE (c:Company {name: '蓝海科技', founded: 2015, revenue: 5000})
// 创建多个节点
CREATE (p:Project {name: '智能风控系统', budget: 200}),
(p2:Project {name: '区块链溯源平台', budget: 150})
3.3.2 创建关系
// 先匹配节点,再创建关系
MATCH (c:Company {name: '蓝海科技'})
MATCH (p:Project {name: '智能风控系统'})
CREATE (c)-[i:INVESTS {amount: 200, date: '2024-01-15'}]->(p)
// 或者一步到位
CREATE (c:Company {name: '蓝海科技'})-[i:INVESTS {amount: 200}]->(p:Project {name: '智能风控系统'})
3.3.3 查询操作
// 查询所有公司及其投资项目
MATCH (c:Company)-[i:INVESTS]->(p:Project)
RETURN c.name AS 公司名称, p.name AS 项目名称, i.amount AS 投资金额
// 查询投资金额大于100万的项目
MATCH (c:Company)-[i:INVESTS]->(p:Project)
WHERE i.amount > 100
RETURN c, p, i
3.3.4 更新操作
// 更新节点属性
MATCH (c:Company {name: '蓝海科技'})
SET c.revenue = 6000, c.updated_at = datetime()
// 更新关系属性
MATCH (c:Company)-[i:INVESTS]->(p:Project {name: '智能风控系统'})
SET i.amount = 250
3.3.5 删除操作
// 删除关系
MATCH (c:Company)-[i:INVESTS]->(p:Project)
DELETE i
// 删除节点(必须先删除所有关系)
MATCH (p:Project {name: '智能风控系统'})
DETACH DELETE p
MATCH (n) DETACH DELETE n,结果整个数据库被清空。幸好有备份,不然就凉了。所以,删除操作前一定要先查一下,确认数据范围。
3.4 索引与约束
数据量大了之后,没有索引的查询就像在大海里捞针。我见过一个项目,几百万节点的查询要跑几十秒,加上索引后秒级返回。
3.4.1 创建索引
// 创建单属性索引
CREATE INDEX company_name_index FOR (c:Company) ON (c.name)
// 创建复合索引
CREATE INDEX company_name_revenue_index FOR (c:Company) ON (c.name, c.revenue)
// 查看所有索引
SHOW INDEXES
3.4.2 创建约束
约束能保证数据的唯一性和完整性。比如,公司名称应该是唯一的:
// 创建唯一约束
CREATE CONSTRAINT unique_company_name FOR (c:Company) REQUIRE c.name IS UNIQUE
// 创建存在性约束(属性不能为空)
CREATE CONSTRAINT company_name_exists FOR (c:Company) REQUIRE c.name IS NOT NULL
// 查看所有约束
SHOW CONSTRAINTS
3.4.3 索引与约束的对比
| 特性 | 索引 | 约束 |
|---|---|---|
| 目的 | 加速查询 | 保证数据完整性 |
| 是否影响写入 | 写入变慢(需维护索引) | 写入时检查约束 |
| 能否重复 | 可以创建多个 | 每个属性只能一个 |
| 删除语法 | DROP INDEX index_name | DROP CONSTRAINT constraint_name |
嗯,这里要注意:索引不是越多越好。每个索引都会增加写入开销。我一般只在经常查询的字段上建索引,比如name、id这类字段。
3.5 本章知识体系
为了让你更直观地理解本章的知识结构,我画了一张图:
这张图把本章的核心内容串起来了。从安装配置开始,到Cypher语法,再到CRUD操作,最后用索引和约束来优化。你想想看,是不是一条清晰的学习路径?
好了,Neo4j的基础操作就讲到这里。我个人觉得,图数据库最迷人的地方在于它的直观性——你不需要复杂的JOIN,只需要用模式匹配就能表达复杂的关联关系。下一章,咱们会用这些知识来构建真正的金融知识图谱。
公众号:蓝海资料掘金营,微信deep3321