ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

RDKit DbFpSupplier 完全指南:从数据库结果集高效读取与遍历分子指纹

2026/10/6 1:55:09 拓冰建站 浏览量
RDKit DbFpSupplier 完全指南:从数据库结果集高效读取与遍历分子指纹 科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载导读DbFpSupplier是 RDKit 中负责从数据库查询结果集DbResultSet中逐条反序列化并供给分子指纹ExplicitBitVect的核心工具类适用于大规模化合物库的相似性筛选、聚类预处理和虚拟库VLib数据管道等场景。本文围绕 rdkit.Chem.Fingerprints.DbFpSupplier 模块从构造函数、两种迭代模式前向与随机访问、底层反序列化原理到数据库端指纹表的构建与联用给出完整、可运行的实战方案。读完本文你将掌握如何用 RDKit 从数据库批量取出指纹、如何在读取时保留额外字段如 ID、活性值以及如何将前向/随机访问两种供应商灵活接入现有筛选流水线。一、模块定位数据库中的指纹如何进入 RDKit在 RDKit 的经典建库—入库—筛选流程中分子指纹如 RDKit 默认的AutoFragmentFP通常以二进制 pickle 形式存放在数据库表的专用列中。DbFpSupplier扮演的角色就是指纹列解码器 迭代器输入一个Dbase.DbResultSet.DbResultBase子类即数据库查询结果集参见 DbResultSet.py输出内存中的ExplicitBitVect指纹对象且自动将结果集中除指纹列外的其余字段打包到指纹对象的_fieldsFromDb属性中。它继承自 VLibNode因此天然具备虚拟库节点Virtual Library Node的迭代语义__iter__/reset/next可以被直接放进for循环也可以作为 VLib 节点图的一部分与其他节点组合。模块文件位于 rdkit/Chem/Fingerprints/DbFpSupplier.py其 RST 文档入口 rdkit.Chem.Fingerprints.DbFpSupplier.rst 采用automodule自动生成成员文档模块本身的 doctest 与单测UnitTestDbFpSupplier.py共同构成了本模块的行为契约。二、核心类 DbFpSupplier构造、字段提取与指纹解码2.1 构造函数与参数def __init__(self, dbResults, fpColNameAutoFragmentFp, usePicklesTrue):参数类型默认值说明dbResultsDbResultBase子类必填数据库查询结果集由DbConnect.GetData()返回见下文 3.1 节fpColNamestrAutoFragmentFp存放指纹的列名构造时会被upper()后与结果集列名同样大写化比对不匹配立即抛出ValueErrorusePicklesboolTrue指纹列的解码方式True表示用pickle.loads反序列化需配合encodingbytesFalse表示直接把列字节交给DataStructs.ExplicitBitVect构造2.2 构造期的列解析逻辑构造时DbFpSupplier会做三件事对应 DbFpSupplier.py取dbResults.GetColumnNames()全部转大写校验fpColName是否存在不存在则抛出ValueError(fp column name ... not found in result set: ...)记录指纹列下标self.fpCol并将该列从_colNames中剔除剩余的列名元组即附加字段列表可通过GetColumnNames()查询。2.3_BuildFp逐行的解码管线_BuildFp(data)是每个供应商共用的核心解码函数DbFpSupplier.py流程如下def _BuildFp(self, data): data list(data) pkl bytes(data[self.fpCol], encodingLatin1) del data[self.fpCol] self._numProcessed 1 try: if self._usePickles: newFp pickle.loads(pkl, encodingbytes) else: newFp DataStructs.ExplicitBitVect(pkl) except Exception: import traceback traceback.print_exc() newFp None if newFp: newFp._fieldsFromDb data return newFp要点指纹列字节用Latin1编码转成bytes再按usePickles分支解码解码失败时打印 traceback 并返回None调用方需自行判空解码成功后结果集中除指纹列以外的所有字段以列表形式挂到fp._fieldsFromDb例如[ID值, 活性值, ...]这正是后续筛选/聚类时拿到 ID 与标签的关键渠道_numProcessed累计已处理行数可用于进度统计。注意使用 pickle 解码时需匹配 Python 2 时代的 pickle 字节串源码显式使用encodingbytes因此旧库导出的指纹 pickle 也能在 Python 3 下稳定加载。三、两个具体供应商ForwardDbFpSupplier 与 RandomAccessDbFpSupplierDbFpSupplier本身是抽象基类实际使用两个子类区别仅在访问模式3.1 前向供应商 ForwardDbFpSupplier适用于只需从头到尾流式读取一次的场景内存友好、可搭配游标边取边读。其NextItem()每次从底层结果集迭代器中取一行并调用_BuildFpreset()会重建底层迭代器并调用基类reset()基类会递归 reset 父节点见 Node.py。模块自带 doctest 演示了完整用法DbFpSupplier.pyfrom rdkit import RDConfig from rdkit.Dbase.DbConnection import DbConnect fName RDConfig.RDTestDatabase # 测试数据库路径 conn DbConnect(fName, simple_combined) # 连接库 表 suppl ForwardDbFpSupplier(conn.GetData()) fps [] for fp in suppl: fps.append(fp) len(fps) # 12conn.GetData()是DbConnect的便捷查询入口DbConnection.py返回一个结果集对象默认randomAccess1走随机访问结果集若想强制前向流式可显式传randomAccess0。3.2 随机访问供应商 RandomAccessDbFpSupplier当需要按下标随机取某一行指纹例如按活性值排序后取 Top-N时使用。它额外实现__len__返回结果集行数__getitem__(idx)按下标取第idx行并解码NextItem()基于内部_pos游标顺序推进越界返回None配合基类next逻辑抛StopIteration。doctest 给出了三类典型用法DbFpSupplier.pyfrom rdkit import RDConfig from rdkit.Dbase.DbConnection import DbConnect conn DbConnect(RDConfig.RDTestDatabase, simple_combined) suppl RandomAccessDbFpSupplier(conn.GetData()) len(suppl) # 12 fp suppl[5] # 按下标取 fp.GetNumBits() # 128 fp.GetNumOnBits() # 54 # 标准 for 循环内部走 NextItem fps [] for fp in suppl: fps.append(fp) len(fps) # 12 # 显式下标循环 fps [None] * len(suppl) for i in range(len(suppl)): fps[i] suppl[i] len(fps) # 12两种供应商都通过__next__ next兼容 Python 3 迭代协议均可直接用于for循环。四、字段保留机制_fieldsFromDb与GetColumnNames这是DbFpSupplier最实用的设计之一。假设表结构为IDSMILESAutoFragmentFPactivityMOL001CC(O)Oc1ccccc1C(O)Obinary0.87以fpColNameAutoFragmentFp构造后GetColumnNames()返回(ID, ACTIVITY)指纹列已被剔除每个解码出的指纹fp._fieldsFromDb [MOL001, 0.87]即按列顺序排列的附加字段列表。这一机制在 MolSimilarity.py 中被实际消费GetFingerprints()用DbFpSupplier.ForwardDbFpSupplier包装查询结果并明确注释每个指纹的_fieldsFromDb首项即 ID随后筛选逻辑据此取回命中分子的标识符。五、数据从哪来数据库指纹表的生成与查询5.1 用 FingerprintMols 生成指纹表DbFpSupplier读取的指纹表可由 FingerprintMols.py 命令行工具生成。其模块头部的示例python FingerprintMols.py -d data.gdb \ -t raw_dop_data --smilesNameStructure --idNameMol_ID \ --outTabledaylight_sig该命令从表raw_dop_data读取 SMILES 列计算指纹后写入新表daylight_sig。写入时指纹列以二进制形式落库DbModule.binaryHolder(fp.ToBinary())列类型使用DbModule.binaryTypeNameFingerprintMols.py。常用参数与默认值对应FingerprinterDetails._fingerprinterInit见 FingerprintMols.py参数默认值含义--fpColNameAutoFragmentFP输出表中存储指纹的列名与DbFpSupplier默认值一致--maxSize2048指纹基础长度--minSize64允许折叠的最小长度--density0.3目标位密度超过则折叠--minPath/--maxPath1/7路径指纹的路径范围--nBitsPerHash2每个片段置位数-H/-V关是否包含 H / 价态信息--useMACCS关改用 MACCS 键指纹--outTable/--outDbName无输出表/库名--keepTable关默认替换表保留已存在的输出表关键约定生成时用的fpColName必须与读取时传入DbFpSupplier的fpColName保持一致且建议保持表结构不变否则_fieldsFromDb的字段顺序会与预期不符。5.2 手工查询并构造结果集也可以不借助 CLI直接用DbConnect查询任意含指纹列的表from rdkit.Dbase.DbConnection import DbConnect from rdkit.Chem.Fingerprints import DbFpSupplier conn DbConnect(my_lib.gdb, daylight_sig) data conn.GetData(fields*) # 或指定字段 suppl DbFpSupplier.ForwardDbFpSupplier(data, fpColNameAutoFragmentFP) for fp in suppl: if fp is not None: print(fp.GetNumOnBits(), fp._fieldsFromDb)底层结果集类型见 DbResultSet.pyDbResultSet前向流式边取边读与RandomAccessDbResultSet随机访问可__getitem__/__len__分别与上文两个供应商配对GetData的removeDups参数还能按指定列去重。六、接入相似性筛选流水线DbFpSupplier在 RDKit 的库内筛选场景中位于取指纹环节。MolSimilarity.py 的ScreenInDb展示了完整链路对探针分子计算指纹FingerprintMols.FingerprintMol若数据库驱动支持rd_tanimoto/rd_dice/rd_cosine等 SQL 函数则在 SQL 层直接完成相似度计算与排序limit/thresh子查询否则回退到内存路径GetFingerprints()通过ForwardDbFpSupplier逐个取指纹再调用ScreenFingerprints用DataStructs.TanimotoSimilarity等度量逐一比对。内存路径的等价手工写法from rdkit import DataStructs from rdkit.Chem import MolFromSmiles from rdkit.Dbase.DbConnection import DbConnect from rdkit.Chem.Fingerprints import DbFpSupplier, FingerprintMols details FingerprintMols.FingerprinterDetails() probeFp FingerprintMols.FingerprintMol(MolFromSmiles(c1ccccc1), **details.__dict__) conn DbConnect(my_lib.gdb, daylight_sig) suppl DbFpSupplier.ForwardDbFpSupplier(conn.GetData(), fpColNameAutoFragmentFP) hits [] for fp in suppl: if fp is None: continue score DataStructs.TanimotoSimilarity(probeFp, fp) if score details.screenThresh: # 默认阈值 0.75 hits.append((score, fp._fieldsFromDb)) hits.sort(reverseTrue)这与 UnitTestDbFpSupplier.py 中的单测行为一致错误列名触发ValueError、构造后GetColumnNames()保留非指纹列如ID。七、常见问题与最佳实践ValueError: fp column name not foundfpColName与结果集列名大小写不一致或表里根本没有该列。构造器对两端都做upper()归一但仍要求拼写完全一致建议统一使用生成表时的--fpColName默认值AutoFragmentFP。返回None的行_BuildFp解码失败会返回None并打印 traceback遍历时必须判空避免后续相似度计算抛异常。字段顺序依赖_fieldsFromDb附加字段按结果集列顺序排列指纹列被剔除查询时若用fields*字段顺序取决于表结构建议显式指定字段列表以稳定顺序。大库场景选型一次全量扫描选ForwardDbFpSupplier流式、低内存需要按下标反复取行选RandomAccessDbFpSupplier其底层结果集支持缓存式随机访问。指纹列格式一致性usePicklesTrue对应 pickle 序列化入库的列CLI 默认usePicklesFalse对应ToBinary()字节直接入库的列两者不能混用选错会导致解码失败。与 VLib 管道组合DbFpSupplier是VLibNode子类可在AddChild/AddParent节点图中作为数据源节点配合Filter/Transform节点构建可重置的虚拟库流水线基类迭代语义见 Node.py。小结DbFpSupplier及其两个子类把数据库查询结果与RDKit 内存指纹之间的鸿沟收敛为一个迭代器协议构造时校验列名、解码时按需反序列化、读取时自动附加数据库字段。它与 FingerprintMols.py建表、DbConnection.py查询、MolSimilarity.py筛选配合构成了一条从原始化合物表到可打分命中列表的完整数据管道是理解 RDKit 数据库化学信息学工作流的重要一环。赞分享科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载相关推荐Probot 分页指南用 octokit.paginate 遍历 GitHub REST API 的全部结果Probot 分页指南用 octokit.paginate 遍历 GitHub REST API 的全部结果 GitHub 的 REST API 对绝大多数列开发工具DevOpsRDKit SimilarityMaps 分子相似性图谱完全指南从指纹贡献到 ML 模型解释RDKit SimilarityMaps 分子相似性图谱完全指南从指纹贡献到 ML 模型解释 相似性图谱Similarity Map是 RDKit 提供的科学计算科研机器学习MikroORM 数据流式处理完全指南用 em.stream 高效遍历海量实体MikroORM 数据流式处理完全指南用 em.stream 高效遍历海量实体 本篇指南聚焦 MikroORM 的流式查询Streaming能力讲解如何后端上一篇3分钟掌握这款免费资源下载神器让你轻松保存视频号、抖音、小红书所有内容下一篇Citra模拟器在电脑上重温任天堂3DS游戏时光的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考