DrugBank 5.1.7 数据库解析与应用:从数据架构到药物研发实战
2026/9/4 18:42:31 网站建设 项目流程

简介:DrugBank 5.17 是面向药物信息学、生物信息学及计算药理学研究者的权威结构化数据资源,适用于开展靶点预测、药物重定位、ADMET建模、知识图谱构建等科研任务。资源为单文件ZIP压缩包(140.19MB),内含1个核心XML文件——full database.xml,完整承载该版本全部约14,000+药物条目的标准化描述,涵盖通用名/商品名、SMILES与InChI结构式、ATC分类、作用靶点(含蛋白类型与亲和力)、药代动力学参数、临床适应症与禁忌、不良反应及PMID文献引用等多维度字段。XML格式具备强自描述性,便于通过Python(lxml/ElementTree)、Java(JAXB)或R(xml2)等工具进行解析、抽取与二次分析。已有2160人学习下载,读者可直接获取开箱即用的全量结构化药物知识源,无需注册DrugBank官网或处理API限流,显著提升数据预处理效率与研究可复现性。

1. 从“数据库”到“药物研发的罗塞塔石碑”:DrugBank 5.1.7 究竟是什么?

如果你在生物信息学、药物化学或者计算生物学领域摸爬滚打过一阵子,大概率听说过DrugBank这个名字。它不像PubMed那样是海量文献的索引,也不像UniProt那样专注于蛋白质序列。DrugBank更像是一个精心设计的“中央枢纽”,它的核心使命是把药物、药物靶点、药物作用机制、药代动力学数据、药物相互作用以及相关的疾病信息,全部串联成一个有机的整体。简单来说,它回答的是“什么药,通过什么方式,作用于身体的哪个部分,会产生什么效果,以及可能和谁‘打架’”这一系列环环相扣的问题。

我最初接触DrugBank还是在做一个小分子虚拟筛选项目的时候,当时需要为一批候选化合物寻找已知的靶点蛋白,并评估其成药可能性。翻遍了各种分散的数据库,要么只有化合物结构,要么只有靶点信息,关联性非常弱。直到发现了DrugBank,我才意识到一个整合得如此之好的公共资源有多么宝贵。DrugBank 5.1.7是它发展历程中的一个重要版本,虽然现在已经有更新的版本(如5.1.10, 6.0等),但5.1.7因其数据的成熟度和广泛的工具兼容性,至今仍在许多研究场景中被频繁使用和引用。它不是一个冷冰冰的数据仓库,而是药物研发从靶点发现到临床安全评估整个链条中,不可或缺的“翻译官”和“连接器”。

对于不同角色的研究者,DrugBank 5.1.7的价值点也不同:

  • 对于计算化学/药物设计人员:它是获取小分子药物标准结构(SMILEs, InChI)、理化性质、已知相似物和靶点信息的黄金标准来源,是构建药效团模型、进行分子对接或相似性搜索的起点。
  • 对于生物信息学家:它提供了基因、蛋白质与药物之间经过人工审编的高质量关联数据,是构建药物-靶点网络、进行通路富集分析或系统药理学研究的核心数据源。
  • 对于药理/临床研究人员:它详尽的药物说明书信息(适应症、剂量、副作用)、药物相互作用(DDI)数据和ADMET(吸收、分布、代谢、排泄和毒性)属性,是理解药物作用机制和评估临床风险的重要参考。
  • 对于学生和初学者:它是一个结构化的知识宝库,能帮助你直观地理解“药物-靶点-疾病”这个复杂网络的基本框架。

接下来,我们就深入DrugBank 5.1.7的内部,看看它到底由哪些“模块”构成,数据从何而来,又该如何为我所用。

2. DrugBank 5.1.7 的数据架构与核心内容拆解

理解一个数据库,不能只看它有什么,更要看这些数据是如何组织、关联以及保证质量的。DrugBank 5.1.7的数据架构体现了其“桥梁”的定位,我们可以从以下几个核心维度来拆解它。

2.1 数据实体:药物、靶点与它们之间的“关系”

DrugBank的核心是三种实体和它们之间的多重关系。

1. 药物实体这是最核心的部分。DrugBank中的“药物”不仅包括已批准的小分子化学药(如阿司匹林、二甲双胍),还涵盖了生物制剂(如抗体、疫苗)、营养品、实验性化合物甚至非法药物。在5.1.7版本中,包含了超过13,000个药物条目。每个药物条目都是一个结构化的XML或JSON文件,包含数十个字段。关键信息包括:

  • 标识与分类:DrugBank ID(如DB00001)、通用名、商品名、CAS号、药物类别(小分子、生物药等)、治疗类别。
  • 化学信息:这是计算研究的基石。包括化学结构(SMILEs字符串、InChI/InChI Key)、分子式、分子量、logP(脂水分配系数)、pKa(酸解离常数)、氢键供体/受体数量等。这些数据大多经过计算和实验验证。
  • 药理数据:作用机制描述、适应症、药理作用、毒性信息。
  • 药代动力学(ADME):吸收、分布、代谢、排泄的详细参数,如口服生物利用度、蛋白结合率、半衰期、主要代谢酶(如CYP450亚型)。
  • 药物相互作用:列出与该药物存在临床意义相互作用的其他药物清单,并说明相互作用的类型和严重程度。

2. 靶点实体靶点主要是指与药物发生相互作用的蛋白质、核酸等生物大分子。在DrugBank中,靶点信息与UniProt、GenBank等权威数据库深度链接。关键信息包括:

  • 蛋白信息:UniProt ID、基因名、蛋白名、序列、细胞定位、功能描述。
  • 基因信息:与靶点蛋白对应的基因信息,链接到NCBI Gene数据库。
  • 通路信息:该靶点参与的主要生物通路,链接到KEGG、Reactome等通路数据库。

3. 关系实体这是DrugBank的灵魂。它明确定义了“药物A以抑制剂/激动剂/拮抗剂等方式,作用于靶点B”。这种关系不是简单的关联,而是带有“动作”和“属性”的。例如,关系数据会说明药物是“抑制剂”,其作用力大小(Ki, IC50值),以及该数据的参考文献。这种精细化的关系描述,对于构建精准的计算模型至关重要。

2.2 数据来源与质量控制:为什么值得信赖?

一个数据库的价值很大程度上取决于其数据的可靠性和更新维护。DrugBank的数据并非自动爬取网络信息,而是采用“人工审编为主,自动集成为辅”的混合模式。

  • 人工审编:这是最耗时但也是最关键的一环。一个由药学、化学、生物学专家组成的团队,会从FDA/EMA药品说明书、高质量的临床药理学期刊(如Clinical Pharmacology & Therapeutics)、药典(如USP)等来源,手动提取、验证并结构化数据。这确保了数据的高准确性和低噪声。例如,一个药物的主要代谢酶信息,会由专家根据多篇文献和官方文件进行确认。
  • 自动集成与链接:对于序列、结构等基础数据,DrugBank通过程序化接口从UniProt、PubChem、ChEBI、KEGG等专业数据库同步,并建立稳定的交叉引用。这保证了数据的广泛性和一致性。
  • 版本化与更新:像5.1.7这样的版本,代表了一个相对稳定的数据快照。虽然它不再更新,但其内部数据是经过多轮校验的“成品”,非常适合需要可重复性的科学研究。官方会定期发布新版本,纳入新批准的药物和最新研究发现。

2.3 数据文件格式与获取:本地化部署的考量

对于大规模分析,在线查询(通过官网)效率太低。DrugBank提供了完整的数据下载包,这是进行本地化、程序化分析的前提。5.1.7版本的下载包通常包含以下核心文件:

  • drugbank_all_full_database.xml.zip最核心的文件。一个巨大的XML文件,包含了所有药物条目的完整信息。文件大小可能超过1GB(解压后)。这是进行深度数据挖掘的基础。
  • target_polypeptide_ids.csv/target_all.csv:以表格形式提取的靶点信息,方便快速导入到R或Python中进行分析。
  • drugbank_all_structures.sdf:所有药物的2D/3D结构文件,格式为SDF,可直接被Open Babel、RDKit等化学信息学工具读取,用于分子相似性计算或虚拟筛选。
  • drug_links.csv:包含DrugBank ID与其他数据库ID(如PubChem CID, ChEBI ID, KEGG Drug ID)的映射关系,用于数据整合。

注意:自DrugBank 5.0之后,获取完整数据需要注册并申请(通常面向学术用户免费)。这是一个合理的数据使用协议,确保了数据库的可持续运营。申请时需要提供真实的学术邮箱和简要的研究用途说明。

3. 实战指南:如何将DrugBank 5.1.7数据“用起来”

拿到数据只是第一步,如何高效地解析、查询和利用这些结构化数据才是关键。下面我将分享几种最常用的实战路径。

3.1 路径一:使用官方API与在线工具进行快速探索

对于初步探索或简单查询,不建议一开始就处理庞大的XML文件。DrugBank官网提供了友好的搜索界面和有限的API功能。

  • 高级搜索:你可以通过药物名、靶点名、基因名、适应症甚至化学子结构进行搜索。例如,搜索“CYP3A4”,可以立刻找到所有已知由此酶代谢的药物列表,并看到每个药物是“底物”、“抑制剂”还是“诱导剂”。这对于研究药物相互作用非常直观。
  • API访问:DrugBank提供RESTful API(通常需要申请API密钥),允许你通过程序查询单个药物的基本信息。例如,一个简单的GET请求到https://go.drugbank.com/.../drugs/DB01001.json就能以JSON格式获取到药物“雷尼替丁”的数据。这适合集成到你的Web应用或简单的数据抓取脚本中。但要注意,免费API通常有调用频率限制,且可能不返回全部字段。

3.2 路径二:本地解析XML文件进行深度数据挖掘

这是生物信息学分析中最主流、最灵活的方式。核心挑战在于解析那个巨大的、嵌套结构复杂的XML文件。

工具选型与思路: 我强烈推荐使用Python生态中的工具,特别是lxmlxml.etree.ElementTree库。为什么不直接用文本编辑器或Excel?因为XML的嵌套层级很深,一个药物条目下可能有多个靶点,每个靶点下又有多个作用关系和多篇参考文献,这种树状结构用表格处理会非常痛苦。

实操步骤示例:提取所有小分子药物及其靶点列表假设你的研究目标是构建一个“药物-靶点”二分网络,你需要两个列表:所有小分子药物的DrugBank ID和名称,以及它们对应的靶点UniProt ID。

  1. 环境准备:确保安装了Python和lxml库 (pip install lxml)。下载drugbank_all_full_database.xml.zip并解压。

  2. 使用迭代解析:由于文件巨大,一次性加载到内存可能崩溃。应使用lxmliterparse方法进行增量解析。

    from lxml import etree import csv # 定义我们要收集的数据结构 drug_target_pairs = [] # 使用iterparse,事件驱动地解析文件 context = etree.iterparse('full database.xml', events=('end',), tag='drug') for event, elem in context: # 只处理药物条目 if elem.tag == 'drug': drug_type = elem.find('{*}groups/{*}group').text # 只关注小分子药物(生物药逻辑不同) if 'approved' in drug_type and elem.find('{*}calculated-properties') is not None: drug_id = elem.find('{*}drugbank-id[@primary="true"]').text drug_name = elem.find('{*}name').text # 查找该药物的所有靶点 targets = elem.findall('.//{*}targets/{*}target') for target in targets: # 获取靶点的UniProt ID polypeptide = target.find('{*}polypeptide') if polypeptide is not None: uniprot_id_elem = polypeptide.find('{*}external-identifiers/{*}external-identifier[{*}resource="UniProtKB"]') if uniprot_id_elem is not None: uniprot_id = uniprot_id_elem.find('{*}identifier').text # 记录这对关系 drug_target_pairs.append([drug_id, drug_name, uniprot_id]) # 非常重要:清理已处理元素,释放内存 elem.clear() while elem.getprevious() is not None: del elem.getparent()[0] # 将结果保存到CSV文件 with open('drug_target_network.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['DrugBank_ID', 'Drug_Name', 'UniProt_ID']) writer.writerows(drug_target_pairs) print(f"共提取到 {len(drug_target_pairs)} 条药物-靶点关系。")

    踩坑提醒:XML文件中的标签带有命名空间(如{http://www.drugbank.ca})。在lxml中,你必须使用{*}tag的形式来查找,或者先获取根节点的命名空间映射。上述代码中的{*}是一种通配写法,在简单解析时比较方便。更严谨的做法是先解析命名空间。

  3. 结果与应用:生成的drug_target_network.csv文件,可以直接导入到Cytoscape、Gephi等网络可视化软件中,生成药物-靶点相互作用网络图,用于发现核心靶点或药物重定位。

3.3 路径三:与化学信息学工具链整合

对于药物化学家,更需要的是分子的结构信息。这时,SDF文件 (drugbank_all_structures.sdf) 就派上用场了。

使用RDKit进行分子处理: RDKit是Python中处理化学信息的首选库。

from rdkit import Chem from rdkit.Chem import PandasTools # 读取SDF文件 suppl = Chem.SDMolSupplier('drugbank_all_structures.sdf') mols = [] ids = [] names = [] for mol in suppl: if mol is not None: # 确保分子被成功读取 mols.append(mol) # 从分子属性中读取DrugBank ID和名称 ids.append(mol.GetProp('DATABASE_ID')) names.append(mol.GetProp('GENERIC_NAME')) # 可以转换为Pandas DataFrame方便分析 import pandas as pd df_molecules = pd.DataFrame({'DrugBank_ID': ids, 'Name': names, 'ROMol': mols}) # 计算一些简单的分子描述符 from rdkit.Chem import Descriptors df_molecules['MolecularWeight'] = df_molecules['ROMol'].apply(Descriptors.MolWt) df_molecules['LogP'] = df_molecules['ROMol'].apply(Descriptors.MolLogP) df_molecules['NumHDonors'] = df_molecules['ROMol'].apply(Descriptors.NumHDonors) df_molecules['NumHAcceptors'] = df_molecules['ROMol'].apply(Descriptors.NumHAcceptors) print(df_molecules[['DrugBank_ID', 'Name', 'MolecularWeight', 'LogP']].head())

通过这一步,你就拥有了一个包含所有药物结构信息和基本理化性质的本地数据框,可以轻松进行基于结构的相似性搜索(如计算Tanimoto系数)、子结构匹配或应用机器学习模型预测性质。

4. 进阶应用场景与避坑指南

掌握了基础的数据获取和解析后,我们可以看看DrugBank 5.1.7能在哪些具体的研究场景中发挥威力,以及过程中有哪些常见的“坑”。

4.1 场景一:药物重定位(老药新用)的计算筛选

药物重定位是发现已批准药物新适应症的过程,能大幅降低研发成本和时间。DrugBank是构建此类计算模型的理想数据源。

操作思路

  1. 构建已知关系矩阵:利用解析出的“药物-靶点”关系,构建一个矩阵,行是药物,列是靶点(或疾病、通路),矩阵中的值表示关系的存在或强度(如1/0,或Ki值的倒数)。
  2. 计算药物相似性:基于这个矩阵,计算药物之间的相似性。方法可以是基于靶点集的Jaccard相似性,也可以是用更复杂的网络推理算法。
  3. 预测新关联:对于某个特定疾病(已知其相关靶点集合),寻找与已知治疗该疾病的药物在靶点谱上高度相似的其他药物。这些药物就是重定位的候选者。

避坑点

  • 数据稀疏性:药物-靶点矩阵非常稀疏(一个药物通常只作用于少数靶点)。直接使用简单相似性度量(如余弦相似性)效果可能很差。需要考虑使用矩阵补全(如协同过滤)或基于网络传播的算法。
  • 关系异质性:DrugBank中的关系有“抑制剂”、“激动剂”、“拮抗剂”等类型。在构建矩阵时,需要决定是否区分这些类型。对于初步筛选,可以只考虑“存在相互作用”;对于精细分析,则需要将作用类型编码进去。
  • 版本一致性:如果你要整合其他数据(如从DisGeNET获取疾病-基因关联),务必注意数据库的版本时间。使用不同时间节点的数据可能导致关联偏差。

4.2 场景二:药物相互作用(DDI)网络分析与风险预测

利用DrugBank中详尽的药物相互作用数据,可以构建DDI网络,用于发现潜在的临床用药风险组合。

操作思路

  1. 提取DDI数据:从每个药物的XML条目中,解析<drug-interactions>标签下的内容。记录相互作用的药物对(A, B)以及相互作用的描述(如“增加出血风险”)。
  2. 构建与可视化网络:将药物作为节点,相互作用作为边,构建网络。使用网络分析指标(如节点的度中心性)来识别“枢纽药物”——那些与许多其他药物存在相互作用的药物(如华法林、地高辛),这些是临床合并用药时需要高度警惕的。
  3. 预测潜在DDI:对于两个没有已知相互作用记录的药物,可以通过计算它们的“相似度”来预测风险。相似度可以基于:①共享的代谢酶(如都经CYP3A4代谢);②共享的靶点;③化学结构相似性。如果两种药物在多个维度高度相似,它们发生相互作用的潜在风险就较高。

避坑点

  • 严重程度缺失:早期版本的DDI数据可能未标准化严重程度等级。你需要手动或通过文本挖掘对“轻微”、“中度”、“严重”等描述进行分类,否则网络边没有权重,分析深度受限。
  • 机制信息不完整:相互作用描述可能是临床现象(如“增加血药浓度”),但未明确机制。理想情况下,应结合代谢酶、转运蛋白数据来阐释机制。这需要整合其他数据库如SuperCYP、TransporterDB。

4.3 场景三:ADMET属性数据库的构建与QSAR建模

药物的吸收、分布、代谢、排泄和毒性(ADMET)属性是成药性的关键。DrugBank系统收集了这些实验或计算数据。

操作思路

  1. 创建本地ADMET数据集:从XML中批量提取关键ADMET字段,如:
    • calculated-properties中的logPWater Solubility
    • pharmacology中的half-lifeclearance
    • metabolism中的主要酶。
    • toxicity中的描述。
  2. 数据清洗与整合:数值型数据(如半衰期)单位可能不统一(小时 vs. 分钟),需要标准化。文本型数据(如毒性)需要编码为分类变量。
  3. 应用于QSAR模型:将这个清洗后的数据集作为训练集,使用药物的分子指纹(从SDF计算)作为特征,可以构建机器学习模型(如随机森林、梯度提升树)来预测新化合物的ADMET属性。例如,预测一个新化合物是否可能是CYP3A4的强抑制剂。

避坑点

  • 数据缺失与异质:不是所有药物都有完整的ADMET数据。很多字段是空的。构建模型前,需要仔细处理缺失值,是删除整条记录,还是用同类药物的中位数/众数填充,需要根据数据缺失模式和后续模型评估来决定。
  • 实验 vs. 计算值calculated-properties中的logP等是计算值,而有些文献引用的是实验值。在同一个模型中使用时,要明确标注数据来源,最好能分开建模或评估计算值与实验值的偏差。
  • 类别不平衡:例如,在预测“是否具有肝毒性”时,具有明确肝毒性记录的药物可能远少于没有记录的药物。需要使用过采样、欠采样或调整模型代价敏感度的方法来处理。

5. 版本迭代与数据维护的思考

虽然我们聚焦于5.1.7,但必须意识到数据库是活的。DrugBank一直在更新,现在已经到了6.0甚至更高版本。作为使用者,我们需要有版本管理的意识。

  • 为什么有时仍用5.1.7?:因为你的研究可能基于一篇2018年的经典论文,该论文使用了DrugBank 5.1.7的数据。为了确保结果的可重复性和可比性,你必须使用相同版本的数据集。这是计算生物学研究可重复性的基本要求。
  • 何时升级到新版本?:当你开始一个全新的项目,或者需要最新批准的药物信息时(例如,研究新冠治疗药物,就需要2020年之后的版本)。新版本通常会修复旧版本的错误,增加新数据字段(如更详细的药物转运体信息),并改善数据模型。
  • 如何管理多版本数据?:在团队或实验室中,建议建立本地的数据仓库。为每个重要项目明确记录其所依赖的DrugBank(及其他数据库)版本号。数据文件可以按版本号存储在目录中,如/data/drugbank/v5.1.7/,/data/drugbank/v6.0/。相关的解析脚本也最好带上版本标签,因为不同版本的XML结构可能有细微调整。

最后,我想分享一点个人体会:DrugBank这样的数据库,其威力不在于数据量最大,而在于数据的高度整合与高质量审编。它节省了研究者们东拼西凑、反复验证数据的时间。真正用好它,关键不在于写出多复杂的解析代码,而在于你是否清晰地定义了自己的科学问题,并能精准地将问题映射到数据库的特定实体和关系上。比如,你的问题是“哪些已上市药物可能通过抑制X靶点来治疗Y疾病?”,那么你的操作链就是:1) 从疾病数据库找到Y疾病的关联基因;2) 在DrugBank中查找以这些基因产物为靶点的药物;3) 过滤出已批准药物;4) 查阅这些药物的适应症,排除已用于Y病的,剩下的就是候选列表。这个思维过程,比任何工具技巧都重要。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询