药物基础知识:从化学结构到治疗作用

各位,如果你要搭建药物知识图谱,第一件事不是去写代码,而是先把药是怎么来的、怎么起作用的理清楚。我当年刚接触这个领域时,就踩过一个坑——以为只要把药物名称和靶点列出来就算知识图谱了,结果项目评审时被问到「这个药为什么能作用于那个靶点」,我一问三不知。嗯,从那以后我养成了一个习惯:每类药物的化学基础、靶点类型、作用机制,必须先在脑子里过一遍。

药物化学基础

药物化学说白了就是研究「分子长什么样,哪个部位最关键」。你想想看,一个药分子上有几十个原子,真正决定药效的往往就是那一个基团或一个手性中心。

概念解释我的经验
药效团药物分子中与靶点结合的核心片段我曾用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。所以你想想看,不做对齐的话,图谱里就会长出两个一模一样的节点。

常见的靶点类型,我按机制分成这几类:

  1. G蛋白偶联受体(GPCR)——最大的一类靶点,约占上市药物的35%。比如β2肾上腺素受体,用于哮喘。
  2. 离子通道——控制离子进出细胞,比如钠通道阻滞剂利多卡因。
  3. 激酶——催化磷酸化,很多抗癌药靶向酪氨酸激酶。
  4. 核受体——转录因子,如雌激素受体(ER)靶向药他莫昔芬。
  5. 酶——抑制酶的活性,如ACE抑制剂降压。
  6. 转运体——比如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

这样跑出来的结果,可以直接用来做后续的聚类或推荐。你想想看,如果数据是规范化的,这个查询一秒就能搞定。

下面是我为本章汇制的知识体系图,展示了药物化学、靶点、作用机制三者之间的核心关系:

药物基础知识核心结构 药物化学基础 药效团 · logP · pKa · 手性 药物靶点 GPCR · 激酶 · 离子通道 · 核受体 作用机制 激动 · 拮抗 · 抑制 · 变构 知识图谱三元组 药物 — has_target → 靶点 | 药物 — has_mechanism → 机制 药物重定位 副作用预测 个性化用药 只有把化学、靶点、机制三块对齐,知识图谱才能真正用于推理和发现

特别注意:有很多人把「靶点」和「作用对象」搞混。比如某种抗生素的作用靶点是核糖体,但最终作用对象是细菌。在知识图谱里如果混淆层级,推理结果就会变得离谱。我建议在节点上加一个「层级」标签:分子靶点、细胞靶点、生物体靶点。

最后交个底:本章讲的都是最基础的东西,但基础打牢了,后面搭建图谱、做推理、搞可视化才不会翻车。我个人习惯是每讲一个知识点,就顺手把对应的Cypher查询或Python代码写出来,这样边学边用,记忆更深刻。希望你也能试试。