1. Neo4j简介:图数据库概念、Neo4j特点、应用场景(药物发现)、安装与启动

我们开始这门课的第一讲。既然是第一讲,我不打算一上来就扔概念,而是先聊聊为什么药物发现领域会跟图数据库扯上关系。

几年前我接手过一个靶点优先排序的项目,数据源是几个公开库加内部实验数据。当时我的第一反应是用关系型数据库,PostgreSQL 嘛,顺手。结果一跑关联查询,嗯,JOIN 了七八张表,一条路径分析跑了快半小时。后来换成 Neo4j 重写,同样的查询降到秒级。从那以后,我对图数据库的看法彻底变了。

1.1 图数据库概念——不只是“图”

先搞清楚一件事:图数据库里的“图”,不是图表,是 Graph,由节点(Node)和关系(Relationship)组成的网络。节点代表实体,关系代表实体之间的语义连接。

我习惯用一句话跟同事解释:关系数据库存的是表,图数据库存的是“邻居”。你想想看,在药物发现中,药物和靶点之间的关系比药物本身的属性更重要。对不对?

图数据库的核心要素其实就四个:

  • 节点 —— 实体,比如“药物”、“靶点”、“疾病”
  • 关系 —— 连接,比如“作用于”、“抑制”、“导致”
  • 属性 —— 实体或关系的键值描述,比如药物的分子量、靶点的基因符号
  • 标签 —— 节点的分组,比如 :Drug、:Target、:Disease

关键认知:图数据库是“面向连接的”。关系型数据库擅长存“是什么”,图数据库擅长存“怎么连”。药物靶点知识图谱天然就是一张大网,所以 Neo4j 特别适合。

1.2 Neo4j 特点——为什么它成为行业标杆

说实话,市面上的图数据库不少,但 Neo4j 的用户量和生态最强。我个人看中它三点:

  1. 原生图存储 —— 它的存储引擎就是按图结构设计的,不是把图映射到关系表上。这意味着遍历边的时候,地址直接相连,没有表索引的额外开销。
  2. 属性图模型 —— 节点和关系都可以带属性,这很灵活。我在项目中经常把实验的 IC50 值直接挂在“作用于”关系上,不用额外建一张表。
  3. Cypher 查询语言 —— 它有点像 SQL,但专门为图遍历设计。写一个匹配路径的查询,几行 Cypher 就能搞定,换 SQL 能写两页。

再补充一个避坑经验:我曾经在部署一个大规模知识图谱时没注意 Neo4j 的堆内存限制,结果跑复杂查询时频繁 OOM。后来设置 dbms.memory.heap.max_size=4G 才稳住。

Neo4j vs 关系数据库核心对比
维度 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 本章知识体系速览

为了让这一章的结构清晰,我画了一张图,把核心概念串起来。

Neo4j 核心概念与药物发现场景 图数据库核心概念 · 药物发现场景 节点 (Node) 关系 (Rel) 属性 标签如 :Drug 标签如 :Target 药物:伊马替尼 靶点:BCR-ABL ACT_ON 关系属性: IC50=0.6nM phase=approved 疾病:慢性髓系白血病 TREATS Cypher 查询示例: MATCH (d:Drug)-[:ACT_ON]->(t:Target) WHERE t.name='BCR-ABL' RETURN d

这张图从左到右展示了图数据库的基本元素:节点、关系、属性、标签。底下用了一个药物发现的真实案例——伊马替尼作用于 BCR-ABL 靶点,治疗慢性髓系白血病。关系上挂的 IC50 值就是属性。这些概念你后面每节课都会遇到。

提示:如果你现在已经安装了 Neo4j,可以打开浏览器输入以下语句试试(这是 Cypher 入门第一条):

:play intro

它会带你走一遍交互式教程。

嗯,第一章就到这里。核心内容不多,但打稳基础很重要。下次见面我们直接上手建一个药物-靶点图谱。