简介DrugBank 5.17 是面向药物信息学、生物信息学及计算药理学研究者的权威结构化数据资源适用于开展靶点预测、药物重定位、ADMET建模、知识图谱构建等科研任务。资源为单文件ZIP压缩包140.19MB内含1个核心XML文件——full database.xml完整承载该版本全部约14,000药物条目的标准化描述涵盖通用名/商品名、SMILES与InChI结构式、ATC分类、作用靶点含蛋白类型与亲和力、药代动力学参数、临床适应症与禁忌、不良反应及PMID文献引用等多维度字段。XML格式具备强自描述性便于通过Pythonlxml/ElementTree、JavaJAXB或Rxml2等工具进行解析、抽取与二次分析。已有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生态中的工具特别是lxml或xml.etree.ElementTree库。为什么不直接用文本编辑器或Excel因为XML的嵌套层级很深一个药物条目下可能有多个靶点每个靶点下又有多个作用关系和多篇参考文献这种树状结构用表格处理会非常痛苦。实操步骤示例提取所有小分子药物及其靶点列表假设你的研究目标是构建一个“药物-靶点”二分网络你需要两个列表所有小分子药物的DrugBank ID和名称以及它们对应的靶点UniProt ID。环境准备确保安装了Python和lxml库 (pip install lxml)。下载drugbank_all_full_database.xml.zip并解压。使用迭代解析由于文件巨大一次性加载到内存可能崩溃。应使用lxml的iterparse方法进行增量解析。from lxml import etree import csv # 定义我们要收集的数据结构 drug_target_pairs [] # 使用iterparse事件驱动地解析文件 context etree.iterparse(full database.xml, events(end,), tagdrug) 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[primarytrue]).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[{*}resourceUniProtKB]) 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的形式来查找或者先获取根节点的命名空间映射。上述代码中的{*}是一种通配写法在简单解析时比较方便。更严谨的做法是先解析命名空间。结果与应用生成的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/0或Ki值的倒数。计算药物相似性基于这个矩阵计算药物之间的相似性。方法可以是基于靶点集的Jaccard相似性也可以是用更复杂的网络推理算法。预测新关联对于某个特定疾病已知其相关靶点集合寻找与已知治疗该疾病的药物在靶点谱上高度相似的其他药物。这些药物就是重定位的候选者。避坑点数据稀疏性药物-靶点矩阵非常稀疏一个药物通常只作用于少数靶点。直接使用简单相似性度量如余弦相似性效果可能很差。需要考虑使用矩阵补全如协同过滤或基于网络传播的算法。关系异质性DrugBank中的关系有“抑制剂”、“激动剂”、“拮抗剂”等类型。在构建矩阵时需要决定是否区分这些类型。对于初步筛选可以只考虑“存在相互作用”对于精细分析则需要将作用类型编码进去。版本一致性如果你要整合其他数据如从DisGeNET获取疾病-基因关联务必注意数据库的版本时间。使用不同时间节点的数据可能导致关联偏差。4.2 场景二药物相互作用DDI网络分析与风险预测利用DrugBank中详尽的药物相互作用数据可以构建DDI网络用于发现潜在的临床用药风险组合。操作思路提取DDI数据从每个药物的XML条目中解析drug-interactions标签下的内容。记录相互作用的药物对A, B以及相互作用的描述如“增加出血风险”。构建与可视化网络将药物作为节点相互作用作为边构建网络。使用网络分析指标如节点的度中心性来识别“枢纽药物”——那些与许多其他药物存在相互作用的药物如华法林、地高辛这些是临床合并用药时需要高度警惕的。预测潜在DDI对于两个没有已知相互作用记录的药物可以通过计算它们的“相似度”来预测风险。相似度可以基于①共享的代谢酶如都经CYP3A4代谢②共享的靶点③化学结构相似性。如果两种药物在多个维度高度相似它们发生相互作用的潜在风险就较高。避坑点严重程度缺失早期版本的DDI数据可能未标准化严重程度等级。你需要手动或通过文本挖掘对“轻微”、“中度”、“严重”等描述进行分类否则网络边没有权重分析深度受限。机制信息不完整相互作用描述可能是临床现象如“增加血药浓度”但未明确机制。理想情况下应结合代谢酶、转运蛋白数据来阐释机制。这需要整合其他数据库如SuperCYP、TransporterDB。4.3 场景三ADMET属性数据库的构建与QSAR建模药物的吸收、分布、代谢、排泄和毒性ADMET属性是成药性的关键。DrugBank系统收集了这些实验或计算数据。操作思路创建本地ADMET数据集从XML中批量提取关键ADMET字段如calculated-properties中的logP、Water Solubility。pharmacology中的half-life、clearance。metabolism中的主要酶。toxicity中的描述。数据清洗与整合数值型数据如半衰期单位可能不统一小时 vs. 分钟需要标准化。文本型数据如毒性需要编码为分类变量。应用于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病的剩下的就是候选列表。这个思维过程比任何工具技巧都重要。本文还有配套的精品资源点击获取