3、Neo4j图数据库入门:Neo4j安装与配置、Cypher查询语言基础、节点与关系的CRUD操作、索引与约束

好,咱们进入图数据库的世界。说实话,Neo4j是我个人最常用的图数据库,没有之一。当年我第一次接触知识图谱时,就被它的“节点-关系”模型震撼到了——这不就是现实世界最自然的映射方式吗?

这一章,咱们把Neo4j从安装到基本操作全部过一遍。你想想看,如果连数据库都不会装、不会查,那后面的知识图谱驱动问答系统就是空中楼阁。所以,咱们一步一个脚印来。

3.1 Neo4j安装与配置

安装Neo4j其实很简单,但有几个坑我得提前告诉你。我曾在项目中因为版本选错,折腾了一整天。

3.1.1 下载与安装

我个人习惯用社区版(Community Edition),免费且功能足够。企业版虽然多了集群和权限控制,但咱们做课程用社区版完全OK。

安装步骤:

  1. 访问Neo4j官网下载页面,选择对应操作系统的版本
  2. Windows用户下载exe安装包,Mac/Linux用户下载tar.gz压缩包
  3. 解压后,进入bin目录,执行启动命令
# Linux/Mac 启动命令
./neo4j start

# Windows 启动命令(在bin目录下)
neo4j.bat start
⚠️ 避坑指南: 我曾经因为Java版本不匹配,启动时报错“Unsupported major.minor version”。Neo4j 4.x需要Java 11,Neo4j 5.x需要Java 17。一定要先检查java -version!

3.1.2 配置修改

默认配置下,Neo4j只允许本地访问。但咱们做开发时,经常需要远程连接。修改conf/neo4j.conf文件:

# 允许远程连接
dbms.default_listen_address=0.0.0.0

# 修改默认密码(可选)
dbms.security.auth_enabled=true

启动成功后,浏览器访问 http://localhost:7474,默认账号密码都是 neo4j。第一次登录会要求修改密码。

💡 小技巧: 我习惯把Neo4j的数据目录单独放在SSD上,查询速度能提升30%以上。特别是当数据量达到百万级节点时,这个优化效果很明显。

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:如果存在则匹配,不存在则创建
🔑 核心概念: Cypher的查询本质上是“模式匹配”。你写一个图模式,Neo4j就去图中找所有匹配这个模式的子图。这比SQL的JOIN操作直观得多。

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: '智能风控系统'})
💡 个人经验: 我建议用MATCH+CREATE的方式,而不是一步到位。因为一步到位容易创建重复节点。我在项目中就吃过这个亏,后来改用MERGE命令,完美解决。

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 本章知识体系

为了让你更直观地理解本章的知识结构,我画了一张图:

Neo4j图数据库入门知识体系 安装与配置 Cypher查询语言 节点与关系CRUD 索引与约束 下载安装 · 配置修改 · 启动验证 MATCH · WHERE · RETURN · CREATE 创建 · 查询 · 更新 · 删除 CREATE INDEX · CREATE CONSTRAINT 核心目标:掌握图数据库基础操作,为知识图谱构建打下坚实基础 从安装到CRUD,从查询到优化,一步到位 关键操作速查 🔹 启动:./neo4j start 🔹 查询:MATCH (n:Label) RETURN n 🔹 创建:CREATE (n:Label {prop: 'value'}) 🔹 索引:CREATE INDEX FOR (n:Label) ON (n.prop) 🔹 约束:CREATE CONSTRAINT FOR (n:Label) REQUIRE n.prop IS UNIQUE 🔹 删除:MATCH (n) DETACH DELETE n 🔹 更新:MATCH (n) SET n.prop = 'new' 🔹 查看:SHOW INDEXES / SHOW CONSTRAINTS

这张图把本章的核心内容串起来了。从安装配置开始,到Cypher语法,再到CRUD操作,最后用索引和约束来优化。你想想看,是不是一条清晰的学习路径?

好了,Neo4j的基础操作就讲到这里。我个人觉得,图数据库最迷人的地方在于它的直观性——你不需要复杂的JOIN,只需要用模式匹配就能表达复杂的关联关系。下一章,咱们会用这些知识来构建真正的金融知识图谱。


公众号:蓝海资料掘金营,微信deep3321