图数据库入门: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核心知识体系
常用命令速查
最后给你一份我平时最常用的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的安装、启动和基本操作就讲完了。你打开自己的环境,照着上面的命令敲一遍,亲手建出第一个药物-靶点图谱。你会发现,图数据库真的没那么玄乎——不过就是"谁连了谁"那点事,只不过这次,我们用它来解开药物世界里那张密密麻麻的网。