1. Neo4j简介:图数据库概念、Neo4j特点、应用场景(药物发现)、安装与启动
我们开始这门课的第一讲。既然是第一讲,我不打算一上来就扔概念,而是先聊聊为什么药物发现领域会跟图数据库扯上关系。
几年前我接手过一个靶点优先排序的项目,数据源是几个公开库加内部实验数据。当时我的第一反应是用关系型数据库,PostgreSQL 嘛,顺手。结果一跑关联查询,嗯,JOIN 了七八张表,一条路径分析跑了快半小时。后来换成 Neo4j 重写,同样的查询降到秒级。从那以后,我对图数据库的看法彻底变了。
1.1 图数据库概念——不只是“图”
先搞清楚一件事:图数据库里的“图”,不是图表,是 Graph,由节点(Node)和关系(Relationship)组成的网络。节点代表实体,关系代表实体之间的语义连接。
我习惯用一句话跟同事解释:关系数据库存的是表,图数据库存的是“邻居”。你想想看,在药物发现中,药物和靶点之间的关系比药物本身的属性更重要。对不对?
图数据库的核心要素其实就四个:
- 节点 —— 实体,比如“药物”、“靶点”、“疾病”
- 关系 —— 连接,比如“作用于”、“抑制”、“导致”
- 属性 —— 实体或关系的键值描述,比如药物的分子量、靶点的基因符号
- 标签 —— 节点的分组,比如 :Drug、:Target、:Disease
关键认知:图数据库是“面向连接的”。关系型数据库擅长存“是什么”,图数据库擅长存“怎么连”。药物靶点知识图谱天然就是一张大网,所以 Neo4j 特别适合。
1.2 Neo4j 特点——为什么它成为行业标杆
说实话,市面上的图数据库不少,但 Neo4j 的用户量和生态最强。我个人看中它三点:
- 原生图存储 —— 它的存储引擎就是按图结构设计的,不是把图映射到关系表上。这意味着遍历边的时候,地址直接相连,没有表索引的额外开销。
- 属性图模型 —— 节点和关系都可以带属性,这很灵活。我在项目中经常把实验的 IC50 值直接挂在“作用于”关系上,不用额外建一张表。
- Cypher 查询语言 —— 它有点像 SQL,但专门为图遍历设计。写一个匹配路径的查询,几行 Cypher 就能搞定,换 SQL 能写两页。
再补充一个避坑经验:我曾经在部署一个大规模知识图谱时没注意 Neo4j 的堆内存限制,结果跑复杂查询时频繁 OOM。后来设置 dbms.memory.heap.max_size=4G 才稳住。
| 维度 | Neo4j | 关系数据库 |
|---|---|---|
| 核心模型 | 节点 + 关系 + 属性 | 表 + 行 + 列 |
| 关联查询性能 | O(1) 步内遍历 | 多表 JOIN 随深度指数下降 |
| 模式灵活性 | 无模式或标签约束 | 严格 schema |
| 典型查询语言 | Cypher | SQL |
| 最适合场景 | 社交网络、知识图谱、推荐 | 事务、报表、结构化数据 |
1.3 应用场景:药物发现——为什么需要图数据库
好,现在我们把镜头拉回药物发现。
药物发现本质上是一个“连接”问题:候选化合物连接靶点,靶点连接通路,通路连接疾病,疾病连接表型……数据维度多、关系复杂、层次深。传统 BioSQL 数据库处理这类多跳查询时性能捉急。
我记得有一次做“药物重定位”分析,需要找出所有能同时作用于 A 靶点和 B 靶点的化合物,再进一步看这些化合物是否已经获批。在关系数据库里写那个查询,嵌套了 5 层子查询。但换成 Cypher,只用了 3 行模式匹配就出来了。你说快不快?
提示:如果你还没接触过 Cypher,没关系。上面那句话你可以理解成“写出你想走的路径,图数据库就沿着路径跳过去”,不需要写 JOIN 条件。
以下是我整理的一些典型药物发现场景与对应的图结构:
- 靶点-药物关联:节点是 Drug 和 Target,关系是 ACTS_ON,属性放 Kd 或 IC50
- 通路-疾病关联:节点是 Pathway 和 Disease,关系是 INVOLVED_IN,属性放证据来源
- 药物-副作用关联:节点是 Drug 和 SideEffect,关系是 CAUSES,属性放发生率
- 蛋白-蛋白互作:节点是 Protein,关系是 INTERACTS_WITH,属性放置信度分数
1.4 安装与启动——手把手带你跑起来
这部分我尽量说干货,跳过那些花哨的选项。
Neo4j 社区版完全免费,足够做中小型知识图谱。我建议你直接下载预打包的 tar.gz / zip 版本,不要从源码编译,浪费时间。
以下以 Linux / macOS 为例(Windows 用户对应下载 .exe 安装包):
# 1. 下载 Neo4j 社区版(选择最新稳定版)
wget https://neo4j.com/artifact.php?name=neo4j-community-5.20.0-unix.tar.gz
# 2. 解压到你的工作目录
tar -xzf neo4j-community-5.20.0-unix.tar.gz
cd neo4j-community-5.20.0/
# 3. 查看配置(可选,默认配置即可)
cat conf/neo4j.conf | grep -v "^#" | grep -v "^$"
注意:Neo4j 5.x 需要 JDK 17 或以上。我踩过这个坑——装完 Neo4j 启动报错,检查日志才发现 JVM 版本不对。可以用 java -version 先确认。
启动和停止的命令也非常简单:
# 前台启动(便于观察日志)
bin/neo4j console
# 或后台启动
bin/neo4j start
# 停止
bin/neo4j stop
# 查看状态
bin/neo4j status
启动成功后,默认浏览器访问 http://localhost:7474 就可以进入 Neo4j Browser。第一次登录账号密码都是 neo4j,会让你立即改密码。
我个人习惯把初始密码改成 admin123(演示用),生产环境请设置强密码。
1.5 本章知识体系速览
为了让这一章的结构清晰,我画了一张图,把核心概念串起来。
这张图从左到右展示了图数据库的基本元素:节点、关系、属性、标签。底下用了一个药物发现的真实案例——伊马替尼作用于 BCR-ABL 靶点,治疗慢性髓系白血病。关系上挂的 IC50 值就是属性。这些概念你后面每节课都会遇到。
提示:如果你现在已经安装了 Neo4j,可以打开浏览器输入以下语句试试(这是 Cypher 入门第一条):
:play intro
它会带你走一遍交互式教程。
嗯,第一章就到这里。核心内容不多,但打稳基础很重要。下次见面我们直接上手建一个药物-靶点图谱。