图数据库入门:Neo4j的安装、启动与基本操作

好了,我们正式开始接触图数据库。说实话,我第一次接触图数据库时也挺懵的——关系型数据库用惯了,突然冒出个"节点"和"关系",脑子里还得换个模型。不过等你真正上手Neo4j,你会发现它处理药物图谱这类数据,简直像刀切黄油一样顺滑。

我个人习惯把Neo4j比作一张巨大的"知识网"。每个药物、每个靶点、每条作用关系,都是这张网上的一个点或一条线。你想想看,用传统的SQL表去查"这个药影响了哪些通路",得写多少个JOIN?而在图数据库里,顺着边走过去就行了。

核心认知:Neo4j是目前最成熟的开源图数据库。它用"节点-关系-属性"的三元组模型,天然适合存储和查询药物图谱中的多对多关联。

安装Neo4j:两种主流方式

根据不同操作系统和环境习惯,我常用的安装方式有两种。我个人更推荐第一种,尤其是你打算长期做项目的话。

方式一:Docker安装(最省心)

Docker的好处是干干净净,不污染宿主机环境。我记得有次在客户服务器上装Neo4j,系统是CentOS 7,包管理源里根本找不到新版本。用Docker的话,一条命令搞定。

拉取镜像并启动容器:

docker run \
  --name neo4j-drug \
  -p 7474:7474 -p 7687:7687 \
  -e NEO4J_AUTH=neo4j/druggraph123 \
  -v /data/neo4j:/data \
  -d \
  neo4j:5-community

端口说明:7474是浏览器管理界面,7687是Bolt协议端口——程序连接用这个。环境变量NEO4J_AUTH设置用户名和密码,我习惯设成和项目名相关的密码,好记。

一点小习惯:我每次新建项目都会把数据卷挂载到/data/项目名路径下。这样换机器或者升级容器时,数据直接带走,不用重新导入。

方式二:桌面版安装(可视化方便)

桌面版适合刚入门时练手,图形化界面让新手心里有底。你去Neo4j官网下载对应操作系统的安装包就行。装了之后,启动Neo4j Desktop,新建一个项目,选Local DBMS,设置密码,点启动——就这么简单。

不过我要提醒一句:桌面版跑大量数据时性能不如服务版。我之前用桌面版导过一份300万节点的药物数据,那个风扇转得……像是在开飞机。

启动与验证:确认服务在跑

启动后,怎么确认它真的活了?

打开浏览器,访问:

http://localhost:7474

看到登录页面,输入用户名neo4j和刚才设的密码,进入管理界面。这里面默认会有一个"初体验"引导教程,我建议你点一遍,花不了几分钟。

或者用命令行验证:

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{"query":"RETURN 1 as result"}' \
  -u neo4j:druggraph123 \
  http://localhost:7474/db/neo4j/tx/commit

返回{"results":[{"columns":["result"],"data":[{"row":[1]}]}]},就代表服务正常。

基本操作:理解Cypher查询语言

Neo4j用Cypher查数据。你别被"查询语言"吓着,其实它的语法很接近自然语言。说白了,它就是在描述"谁连了谁"。

先看最常用的几个命令,我整理成一张表,方便你对照着看:

操作类型 Cypher命令示例 说明
创建节点 CREATE (d:Drug {name:'阿司匹林'}) 创建一个带标签和属性的节点
查询节点 MATCH (d:Drug) RETURN d 查所有Drug标签的节点
创建关系 CREATE (d)-[:TARGETS]->(p:Protein) 创建方向关系
条件筛选 MATCH (d:Drug) WHERE d.name CONTAINS '洛' 用WHERE过滤
删除节点 MATCH (d:Drug {name:'阿司匹林'}) DELETE d 先查后删

曾经踩过的坑:删除节点前必须先把它的关系也删掉,否则Neo4j会报错。正确的做法是MATCH (n)-[r]-() DELETE r, n。我曾经因为忘删关系,在批量清理测试数据时卡了好几分钟。

亲手建一个药物-靶点小图谱

光说不练假把式。来,我们一起在Neo4j里建一个最简单的药物图谱。我会把每个命令一点点拆开说明。

第一步:创建药物节点

CREATE (d1:Drug {
  name: '伊马替尼',
  smiles: 'CC1=C(C=C(C=C1)NC(=O)C2=CC=C(C=C2)CN3CCN(CC3)C)NC4=NC=CC(=N4)C5=CN=CC=C5',
  drugbank_id: 'DB00619'
})
RETURN d1

执行后,你会看到"Created 1 node"和返回的节点属性。

第二步:创建靶点节点

CREATE (p1:Protein {
  name: 'BCR-ABL融合蛋白',
  uniprot_id: 'P00519',
  target_class: '酪氨酸激酶'
})
RETURN p1

第三步:创建它们之间的关系

MATCH (d:Drug {name: '伊马替尼'})
MATCH (p:Protein {name: 'BCR-ABL融合蛋白'})
CREATE (d)-[:TARGETS {
  mechanism: 'ATP竞争性抑制剂',
  affinity_nM: 1.7,
  evidence_level: '临床批准'
}]->(p)
RETURN d, p

这里有个关键点:关系可以带属性。你可以把结合亲和力、作用于靶点的机制、证据等级都挂上去。在做药物图谱分析时,这些属性特别有用。

第四步:多节点关联查询

现在我们再加一个药物,查它俩的共同靶点:

CREATE (d2:Drug {name: '达沙替尼', drugbank_id: 'DB01254'})

MATCH (d2:Drug {name: '达沙替尼'})
MATCH (p:Protein {name: 'BCR-ABL融合蛋白'})
CREATE (d2)-[:TARGETS {
  mechanism: '双重抑制剂',
  affinity_nM: 0.5,
  evidence_level: '临床批准'
}]->(p)

// 查共同靶点
MATCH (d1:Drug {name: '伊马替尼'})-[:TARGETS]->(p:Protein)
MATCH (d2:Drug {name: '达沙替尼'})-[:TARGETS]->(p:Protein)
RETURN p.name, p.target_class

执行这个查询,它会告诉你两个药都靶向同一个蛋白——"BCR-ABL融合蛋白"。这就是图数据库最性感的地方:多跳关联查询,几行Cypher就搞定。

Neo4j核心知识体系

Neo4j核心知识体系 Neo4j核心知识体系 安装方式 Docker部署(推荐) 桌面版安装 启动与验证 Cypher查询语言 CREATE 创建 MATCH 查询 DELETE 删除 RETURN 返回 药物图谱:节点→关系→多跳查询 安装→启动→写Cypher→建图谱,这就是入门Neo4j的完整路径

常用命令速查

最后给你一份我平时最常用的Cypher命令清单。我在项目中经常需要快速导入数据或者做验证,这些命令基本覆盖了90%的场景。

// 查看所有节点标签
CALL db.labels()

// 查看所有关系类型
CALL db.relationshipTypes()

// 查看数据库元信息
CALL db.schema.visualization()

// 节点计数
MATCH (n:Drug) RETURN count(n)

// 删除所有节点和关系(慎用!)
MATCH (n) DETACH DELETE n

// 创建唯一约束(防止重复节点)
CREATE CONSTRAINT drugbank_id_unique
FOR (d:Drug) REQUIRE d.drugbank_id IS UNIQUE

// 创建索引(加速查询)
CREATE INDEX protein_index FOR (p:Protein) ON (p.uniprot_id)

我的建议:任何一个药物图谱项目,开始前就把drugbank_id和uniprot_id设成唯一约束。我吃过重复节点的亏——上次跑批量导入脚本时忘了加约束,结果同一个药物插入了8个副本,后面查关联时数据就乱了。

好,到这里Neo4j的安装、启动和基本操作就讲完了。你打开自己的环境,照着上面的命令敲一遍,亲手建出第一个药物-靶点图谱。你会发现,图数据库真的没那么玄乎——不过就是"谁连了谁"那点事,只不过这次,我们用它来解开药物世界里那张密密麻麻的网。