药物基础知识:从化学结构到治疗作用
各位,如果你要搭建药物知识图谱,第一件事不是去写代码,而是先把药是怎么来的、怎么起作用的理清楚。我当年刚接触这个领域时,就踩过一个坑——以为只要把药物名称和靶点列出来就算知识图谱了,结果项目评审时被问到「这个药为什么能作用于那个靶点」,我一问三不知。嗯,从那以后我养成了一个习惯:每类药物的化学基础、靶点类型、作用机制,必须先在脑子里过一遍。
药物化学基础
药物化学说白了就是研究「分子长什么样,哪个部位最关键」。你想想看,一个药分子上有几十个原子,真正决定药效的往往就是那一个基团或一个手性中心。
| 概念 | 解释 | 我的经验 |
|---|---|---|
| 药效团 | 药物分子中与靶点结合的核心片段 | 我曾用RDKit把药效团提取出来,对比不同药物的相似性,效果不错 |
| 手性中心 | 不对称碳原子,R/S构型不同活性可能天差地别 | 沙利度胺就是个经典教训,R型是镇静,S型致畸 |
| 脂水分配系数(logP) | 衡量药物亲脂/亲水性 | logP太高容易累积在脂肪组织,太低又不进细胞膜 |
| pKa | 决定药物在体内电离状态 | 弱酸弱碱在不同pH下吸收部位差别很大 |
我在做药物相似性分析时,习惯先算一下分子指纹(Morgan Fingerprints)。代码很简单:
from rdkit import Chem
from rdkit.Chem import AllChem
mol = Chem.MolFromSmiles('CC(=O)Oc1ccccc1C(=O)O')
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=2048)
print(fp.ToBitString())
这段代码能帮你把一个阿司匹林的分子结构转成2048位的指纹向量。为什么我要提这个?因为在知识图谱里,我们经常需要根据化学相似性推荐候选药物,指纹就是最直接的「相似度度量工具」。
药物靶点
靶点是药物在体内作用的「锁」。我当年整理靶点数据时,发现一个大坑:同一个靶点在不同数据库里名字可能不一样。比如「EGFR」在UniProt里是P00533,在DrugBank里是DB00053对应的靶点,在ChEMBL里又是另一个ID。所以你想想看,不做对齐的话,图谱里就会长出两个一模一样的节点。
常见的靶点类型,我按机制分成这几类:
- G蛋白偶联受体(GPCR)——最大的一类靶点,约占上市药物的35%。比如β2肾上腺素受体,用于哮喘。
- 离子通道——控制离子进出细胞,比如钠通道阻滞剂利多卡因。
- 激酶——催化磷酸化,很多抗癌药靶向酪氨酸激酶。
- 核受体——转录因子,如雌激素受体(ER)靶向药他莫昔芬。
- 酶——抑制酶的活性,如ACE抑制剂降压。
- 转运体——比如SGLT2抑制剂降血糖。
避坑指南:我曾经在构建图谱时,把「靶点」和「靶点基因」混在一起。比如HER2既是蛋白靶点也是ERBB2基因产物。建议统一用UniProt ID作为靶点主键,基因用HGNC符号,这样后续分析才不会乱。
药物作用机制简介
作用机制(Mechanism of Action, MoA)就是药物怎么改变生理过程。我习惯把它拆成三个层面:分子层面、细胞层面、系统层面。知识图谱里最常用的是分子层面的MoA:激动剂、拮抗剂、变构调节剂、抑制剂等等。
| MoA类型 | 定义 | 举例 |
|---|---|---|
| 激动剂 | 结合靶点并激活其功能 | 多巴胺激动剂(帕金森) |
| 拮抗剂 | 结合靶点但阻断其功能 | β受体拮抗剂(美托洛尔) |
| 变构调节剂 | 结合在别构位点,调节活性 | 苯二氮䓬类(GABA-A变构激动) |
| 不可逆抑制剂 | 共价结合,永久失活 | 阿司匹林(环氧合酶不可逆乙酰化) |
| 前药 | 在体内代谢后才具有活性 | 奥司他韦(磷酸酯水解后才有抗病毒活性) |
记得有一次我在做药物重定位项目,需要快速找出与已知药物MoA相似的候选药。我当时建了一个简单的三元组图谱:药物 - 作用机制 - 靶点。然后用图遍历找「同机制但不同靶点」的组合,还真发现一个他汀类药物可能对某个罕见病有效——当然后来验证失败了,但那个思路我一直在用。
实操建议:如果你从DrugBank导出数据,每条记录都有一个"mechanism of action"字段。但那个字段是自由文本,你需要用NER(命名实体识别)抽取出结构化信息。我推荐先用spaCy+自定义规则做一轮,准确率能到80%左右,剩下的手工校对。
知识图谱中的核心关系
把这些概念整理到图谱里,最核心的三元组关系就是:
药物 - [has_target] - 靶点药物 - [has_mechanism] - 作用机制靶点 - [is_a] - 靶点类别药物 - [has_chemical_structure] - 分子结构
我一般用Neo4j来存储,Cypher查询非常直观。比如查找所有作用于GPCR靶点的药物:
MATCH (drug:Drug)-[:HAS_TARGET]->(target:Target)
MATCH (target)-[:IS_A]->(category:TargetCategory {name: 'GPCR'})
RETURN drug.name, target.name
这样跑出来的结果,可以直接用来做后续的聚类或推荐。你想想看,如果数据是规范化的,这个查询一秒就能搞定。
下面是我为本章汇制的知识体系图,展示了药物化学、靶点、作用机制三者之间的核心关系:
特别注意:有很多人把「靶点」和「作用对象」搞混。比如某种抗生素的作用靶点是核糖体,但最终作用对象是细菌。在知识图谱里如果混淆层级,推理结果就会变得离谱。我建议在节点上加一个「层级」标签:分子靶点、细胞靶点、生物体靶点。
最后交个底:本章讲的都是最基础的东西,但基础打牢了,后面搭建图谱、做推理、搞可视化才不会翻车。我个人习惯是每讲一个知识点,就顺手把对应的Cypher查询或Python代码写出来,这样边学边用,记忆更深刻。希望你也能试试。