2.3.1 子结构检索的计算本质:子图同构与回溯剪枝
这个分子里有酰胺键吗?数据库里哪些分子含苯环?化学信息学的第一代检索技术——子结构匹配(substructure search),亦称子结构检索——回答的正是这类问题。2.1 节已把分子界定为标注图,形式化随之水到渠成:给定查询图(query graph) Q 与目标图(target graph) T,问 Q 能否作为子图嵌入 T。上世纪八十年代以来的商用系统用“位串屏幕 + 图匹配”的两级架构支撑百万级化合物库:屏幕以粗粒度特征快速排除绝大多数分子,图匹配只作最后的精确裁决(Barnard, 1993)。屏幕属于工程加速,语义核心是图匹配本身。
子图同构与匹配。设查询图 Q=(VQ, EQ)、目标图 T=(VT, ET)。若存在单射 φ: VQ→VT,使每个查询原子的谓词在其宿主原子的属性上成真,且每条查询键 (u, v) 都映到目标键 (φ(u), φ(v)) 并满足键谓词,则称 Q 同构于 T 的一个子图,φ 称为一个匹配(match)。匹配既是原子集之间的双射,也是键集之间的双射——键集由原子对唯一确定。
C(=O)N(左)嵌入目标分子乙酰苯胺(右,粗线与蓝圈为命中的原子与键)。匹配只要求查询的全部原子与键在目标中找到像,不要求目标原子“除此之外别无邻居”;单向蕴含正是子图语义的形式表达(式 2.3-1)。复杂性的最坏消息必须先讲清楚:子图同构判定在任意标注图上是 NP 完全问题,任凭标签失去区分度时,搜索空间随查询规模阶乘式膨胀(Barnard, 1993)。分子图却自带三重“驯化”条件。其一,小:药物分子的重原子数多在几十以内,查询规模 k 更小,朴素枚举本身基数有限。其二,稀疏:度数受化合价刚性约束,重原子至多四个重邻居,任何邻接检查都只触及常数个候选。其三,标签强:C、N、O、S 等十余种常见元素天然把原子集切成小块,元素谓词在第一步就砍掉绝大多数宿主候选。
三重条件是经验先验,不是复杂度保证。刻意构造的稠环大分子——富勒烯衍生物、树枝状聚合物——既大又高度对称,匹配耗时明显上升;生产系统为此设置超时与放弃策略,把极端分子记入异常清单而非任其拖垮检索。多数应用看不见这一点,正因为分子图的世界通常站在先验的一侧。
实际算法把“整图判定”拆成“逐步构造”。回溯搜索(backtracking search)的骨架是:给查询原子排一个次序,逐个为其挑选宿主;每一步只在“与已安置邻居相邻、且标签与度数相容”的目标原子里选,无候选即退回上一步换一个选择。剪枝(pruning)的威力来自局部性:元素不符、度数不足、键型不合、单射冲突,每项检查只涉及常数个原子,代价极小,而每剪一刀放弃的是一整棵子树。VF2 算法在这一骨架上加入前看规则——完整匹配尚未形成时即检验“剩余候选是否还够”,并按邻接关系动态排序查询原子(Cordella et al., 2001)。RDKit 的子结构匹配器属于 VF2 一族,另加环-环约束等化学特有的加速(Landrum et al., 2026)。图 2.3-2 展开这棵搜索树。
习题 2.3-1
设 φ: VQ→VT 是查询图 Q 到目标图 T 的一个匹配。(1) 证明:对任意 v∈VQ,必有 degQ(v) ≤ degT(φ(v))。(2) 若查询原子 v 的元素在目标中恰出现 m 次,证明以 v 为第一层的分支数不超过 m。(3) 由此说明,把“标签最稀有”的查询原子放在搜索次序最前,通常能最小化搜索树规模。
参考解答(1) v 的 degQ(v) 个查询邻居经 φ 各自映到 φ(v) 的邻居;φ 是单射,不同的查询邻居映到不同的目标原子,故 φ(v) 至少有 degQ(v) 个邻居。(2) 宿主必须与 v 标签相容,目标中这样的原子恰 m 个,分支数不可能超过它。(3) 搜索树的规模近似为各层分支因子之积;把最小分支因子(稀有标签)放在第一层,等于给整棵树的每个后续节点都换掉了最大的那个乘数,指数底数随之降到最低——这正是 VF2 类算法动态排序查询原子的依据。
2.3.2 匹配的语义:双射、多重匹配与计数
工程接口把匹配分成两个问题。存在性——“这个分子含不含该模式”——返回布尔值,服务于过滤:一个 SMARTS 划过整个化合物库,留下命中的分子。枚举——“命中在哪几个原子、一共有几处”——返回原子编号元组的列表,服务于定位与标注:找出反应发生的原子、标出取代位置、统计官能团个数。两个问题共用同一台匹配器,语义却不同:研究者要清楚自己问的是哪一个。
多重匹配是对称性的直接后果。同一子结构在同一分子里往往有许多个合法双射:苯环查询嵌入甲苯,环自身的六个旋转与两个反射个个都是保标签保键的双射,共 12 个匹配。若研究目标是“官能团个数”,把这 12 个全数出来就会把一个苯环数成十二个;原子集去重(uniquify)把涉及同一原子集的匹配折叠为一个,12 归 1。两个数都对——一个数“嵌入方式”,一个数“结构位置”,错只在问非所答。
枚举的代价也随对称度增长。全部双射的个数等于模式在目标里的对称嵌入数,高对称骨架——大环、稠环、多取代的均三嗪——上可到几十上百;再放到百万级库上逐分子枚举,开销可观。此时先收紧查询(补上度数、氢数、连接数谓词)往往比换更快的匹配器更有效:谓词每收窄一分,图 2.3-2 那棵搜索树的每一层都少一截分支,收益是乘法性的。
匹配对象本身是原子集与键集的双射:接口返回原子编号的元组,键集随原子对唯一确定。这个看似朴素的性质支撑了很多下游用法——把匹配原子写进分子属性即可完成原子标注,供描述符计算、可视化与 2.7 节的反应中心识别直接取用。下段代码印证两问之别与去重语义。
from rdkit import Chem
ring = Chem.MolFromSmarts("c1ccccc1") # 查询:六个芳香碳构成的环
tol = Chem.MolFromSmiles("Cc1ccccc1") # 目标:甲苯
ms = tol.GetSubstructMatches(ring, uniquify=False)
print(len(ms)) # 12 —— 6 个旋转 × 2 个反射,个个都是合法双射
print(len(tol.GetSubstructMatches(ring))) # 1 —— 默认 uniquify:同一原子集只计一次
习题 2.3-2
查询 Q 为氟苯 c1ccccc1F,目标 T 为对氟甲苯 Fc1ccc(C)cc1。分别求 uniquify=False 与 uniquify=True(默认)下的匹配数,并说明两个数的来源。
六元芳香环到自身的保标签双射共 12 个(二面体群 D6 的全部元素:6 个旋转 × 2 个反射)。查询比苯环多了一个约束:查询的氟原子必须映到目标的氟。12 个双射中,把指定顶点送到自身的恰有 2 个——恒等映射,以及过该顶点与对位顶点的反射(这条轴同时固定甲基所在顶点,环上键全部为芳香键,标签无损)。故 uniquify=False 得 2;这 2 个匹配涉及同一组原子,uniquify=True 折叠为 1。对照习题 2.3-1 的(2):氟是目标中的稀有标签,正是它把 12 压到了 2。
2.3.3 SMARTS:从字面到谓词
SMILES 的原子符号是字面:C 就是脂肪族碳,别无他义。SMARTS(SMILES Arbitrary Target Specification)把原子与键的表达式从字面升级为谓词(predicate):元素、度数、氢数、电荷、环隶属都可以进入条件,键也能谈“任意键”“环上键”“双键”。由此,几乎每个合法 SMILES 都是合法 SMARTS,语义却已改变——从“描述一个分子”变为“给一族子结构立判据”(Daylight, SMARTS Theory Manual)。“推广”的准确含义在此:字面是谓词的特例,即恰有一个取值的谓词。2.2 节学过的连接规则、环闭合数字、分支括号原样保留,SMARTS 只换了原子与键的语义单位。
SMILES:字面
原子与键各有一个固定含义:C 即脂族碳,= 即双键。一句话描述一个分子,解析的产物是一张具体的图;书写有规范化问题(2.2 节),但没有真假——分子就是它自己。
SMARTS:谓词
原子与键升级为布尔条件:[#6] 任意碳,~ 任意键,D、H、R 谈连接与环境。一句话给出一族子结构的判据,匹配的产物是一批分子上的命中集合;谓词有宽窄,宽窄即语义。
原子谓词(atom predicate)的常用成分列于表 2.3-1。谓词之间用逻辑算符组合:非 !;与有两种优先级——高优先的 & 与低优先的 ;;或只有低优先的 ,。于是 [#8,#7;!+] 读作“O 或 N,且不带正电荷”:逗号先并列元素,分号再对整组追加条件。与算符分两档正是为了少写括号——[#6&R](既是碳又在环上)先算 &,若要“碳,或者任何环原子”须写 [#6,R] 或显式加括号。键谓词的记号少而精:~ 任意键,- 单键或芳香键,= 双键或芳香键,@ 环键(键在环上),!@ 非环键;省略键符号按“任意键”处理,唯一例外是两个芳香原子之间默认芳香键。例如 [#6]-!@[#6] 表示两个以非环单键相连的碳。递归 SMARTS(recursive SMARTS)再进一步:原子谓词里嵌一个完整模式,如 [$([#7]-[#6]=[#8])] 表示“本原子是连着羰基碳的氮”——谓词谈论的不再是原子的属性,而是它的结构环境。
优先级是初学阶段最常踩的坑,值得用一个对子钉牢:[#6,R;H1] 是“(碳,或任何环原子)且带一个氢”;[#6;R,H1] 是“环上的碳,或任何带一个氢的原子”。字符完全相同,只因分号与逗号的位置不同,语义已分道扬镳。拿不准时,括号永远比优先级记忆可靠——SMARTS 允许在方括号内用圆括号显式分组。
| 成分 | 谓词示例 | 语义 |
|---|---|---|
| 元素与原子序数 | C, n, #6, [#8] | 大写脂族、小写芳香、原子序数 #n |
| 度与连接数 | D2, X3 | D 为显式重邻居数;X 为含氢的总连接数 |
| 氢计数 | H1, !H0 | H 为总氢数;h 为隐式氢数 |
| 总价(键级和) | T4 | 该原子所有键的键级之和 |
| 形式电荷 | +1, -1 | 带指定电荷,!+ 排除正电 |
| 芳与脂 | a, A | 芳香原子 / 脂族原子 |
| 环隶属 | R1, r6 | 属于 R 个环 / 所在最小环的大小 |
| 手性 | @, @@ | 立体中心的两种构型标签 |
写 SMARTS 的两步法。第一步,用最严格的字面 SMILES 写出目标结构本身——想找酰胺就写 CC(=O)NC 这样一个具体实例,此时它已是合法 SMARTS。第二步,把需要泛化的位置逐一换成谓词,其余保持字面:甲基换 [#6],氮氢换 [NX3],并按需补键谓词。每泛化一处,用正例与反例各验一次——“应当命中的是否仍命中,不该命中的是否仍被拒”。两步法把化学直觉放在第一步,把语言技巧放在第二步,出错时也知道该回退到哪一步。
芳香谓词绑定芳香性模型。c 与芳香键 : 的判定依赖目标分子的芳香感知结果,而芳香感知因工具而异:RDKit 的默认模型与 Daylight 并不相同,稠合杂环、带环外双键的体系在不同模型下的芳香原子集合常不一致。跨工具复用 SMARTS 时,先对齐芳香性模型,否则命中集合的差异并非来自模式本身,而来自感知层的分歧。
2.3.4 由简到繁:苯环、氢键受体与酰胺键
实例一:苯环的两极写法。c1ccccc1 只命中“六个芳香碳构成的六元环”,判定与目标的芳香感知绑定(见上节注记)。泛化到另一极端是 [#6]1~[#6]~[#6]~[#6]~[#6]~[#6]1:#6 是任意碳,~ 是任意键,环闭合数字仍强制成环——于是环己烷、环己烯、苯一律命中,问的只是“六元全碳环”。两个模式没有对错,只有化学问题之别:统计 π 体系相互作用时用前者,剥离骨架家族时用后者。谓词的宽窄是研究者的语义选择,SMARTS 只负责忠实执行。
实例二:氢键受体的谨慎收窄。受体的化学定义是“孤对可供电子的原子”,不是一张元素清单。朴素的 [#8,#7] 会把吡啶锚盐 [nH+] 也算作受体——正电荷氮的孤对已被质子占用;酰胺氮的孤对离域进羰基,受体性极弱,化学家通常不把它计入。逐层收窄:加电荷谓词得 [#8,#7;!+],排除正电原子;排除酰胺氮需递归谓词 [#7;!+;!$([#7][#6]=[#8])]——“非正电、且不处于连羰基碳的环境中的氮”。RDKit 官方的 Lipinski 氢键受体 SMARTS 更长,原因正在于边界情形多:酚氧、羰基氧、硝基氧的受体性强弱各异,结构语言只能按类别离散近似。质子化状态随 pH 漂移这一连续谱,SMARTS 表达不了——须在 2.6 节的标准化阶段先定质子化状态,再谈匹配。
实例三:酰胺键,从名词到判据。化学名词“酰胺键”翻译成模式语言,先写 C(=O)N:一个碳,连着双键氧与氮。逐项读出语义:查询未提 C 的其余邻居,所以甲基、芳环作邻居都放行;C–N 之间省略了键符号,按“任意键”处理,连 C=N 双键的酮亚胺也会命中;而 C(=S)N 的硫代酰胺不会命中,因为 =O 是字面谓词。收紧一步得 [CX3](=[OX1])-[NX3]:羰基碳连接数 3、氧连接数 1、酰胺氮总连接数 3(两个重邻居加一个氢),键也钉死为单键或芳香键。官能团检索的意义正在于此——把化学家的名词变成可执行、可复现的结构判据,而“数出分子里有几个酰胺”就是最朴素的结构描述符(2.4 节展开)。下段代码印证语义的三个层次。
amide = Chem.MolFromSmarts("[CX3](=[OX1])-[NX3]") # 度数谓词钉死三个原子的连接
mol = Chem.MolFromSmiles("CC(=O)Nc1ccccc1") # 乙酰苯胺
print(mol.HasSubstructMatch(amide)) # True —— 存在性:过滤用语
print(mol.GetSubstructMatches(amide)) # ((1, 2, 3),) —— 双射以原子编号给出
print(Chem.MolFromSmiles("CC(=S)N").HasSubstructMatch(amide)) # False —— =OX1 拒绝硫代酰胺
过宽与过窄都是误配。过宽制造假阳性:C(=O)N 放行酮亚胺,六元环全碳模式把环己烷算进“苯环家族”,元素清单式的受体模式高估氢键容量。过窄制造假阴性:芳香模式 c1ccccc1 在芳香感知不一致的目标里漏命中,写死氢数的谓词把互变异构的另一态拒之门外。两种错误的代价比想象中高——过滤器漏掉的分子永远不会再出现在结果里,而多出来的分子要用下游实验去伪。规程只有一条:为每个模式维护正例集、反例集与边界例,每改动一处谓词就全部重跑一遍。
习题 2.3-3
写出“苯环上连有吸电子基”的 SMARTS,至少覆盖卤素、硝基、氰基与羰基(醛、酮、酯),逐谓词解释语义;再指出该模式的一个固有局限。
参考解答一种写法:c1ccccc1-[$([F,Cl,Br,I]),$([N+](=O)[O-]),$([CX3]=[OX1]),$([CX2]#N)]。外层 c1ccccc1 是芳香苯环;连字符钉死取代键为单键或芳香键;方括号内用递归 SMARTS 以逗号并列四种邻居环境——卤素直接相连;硝基取标准电荷分离写法 [N+](=O)[O-];$([CX3]=[OX1]) 覆盖经羰基碳相连的醛、酮、酯、酰胺;$([CX2]#N) 是氰基碳。局限:吸电子是电子效应的连续谱,模式只能按基团种类离散近似——磺酰基、三氟甲基须另行追加(后者写作 $([CX4](F)(F)F));间位与对位、共轭路径长短这些决定诱导与共轭强弱的因素,2D 模式一概不问。判定电子效应的强弱,要交给量化参数或电性描述符(2.4 节)。
2.3.5 药效团:给匹配加上几何
药效团(pharmacophore)把生物活性抽象为两件事:一组特征点(feature points)——氢键供体、受体、疏水中心、正电中心、负电中心、芳环中心——以及它们之间的几何约束(geometric constraints)——距离区间、夹角、二面角(Güner, 2000)。配体之所以结合靶点,化学的讲法是“几个功能位点以正确的空间排布各司其职”;药效团就是这段话的形式化。
子结构匹配在这幅图景里处于特殊位置:它是无几何约束的退化特例。特征由显式子结构给出——“受体”不写成功能角色,而写成 [#8,#7;!+] 这样的结构判据;几何约束退化为“按指定连接方式共处同一个分子”。反过来看,药效团对子结构匹配做了两次抽象:原子标签换成功能角色——不再问“是不是氮”,只问“是不是受体”;连接与键级换成数值区间——不问“怎么连”,只问“隔多远”。匹配对象随之从分子图变为特征图,判定从同构检查变为“特征对应 + 几何校验”。
三维药效团检索因此是两步合成:先在构象集合上做特征图匹配,得到候选的特征对应;再用距离、角度约束筛掉不合格的构象。图匹配给出“谁对应谁”,几何给出“够不够格”——两个模块各司其职,恰是 2.3.1 的搜索与 2.3.3 的谓词在三维世界的延伸(图 2.3-3)。对机器学习,这一节留下两点:药效团特征计数与药效团指纹是现成的特征来源;同时它划出了 2D 匹配的边界——无几何、无能量,三维信息要么显式建模,要么明确放弃。
2.3.6 流水线中的位置:过滤、骨架与反应中心
结构过滤。把领域知识固化成一批 SMARTS,在建模之前清理数据,是子结构匹配最广泛的应用。PAINS(pan-assay interference compounds)过滤器标记那些在无关化验里反复“显活性”的干扰结构——荧光团、反应性亲电体、聚集倾向骨架(Baell & Holloway, 2010);毒团警报(toxicophore alert)则标记 Michael 受体片段、芳香硝基、肼等易致毒警示子结构。过滤器本身也有假阳性与假阴性:命中不等于无效或有毒,只是进入人工复核的信号。与 2.1 节的早失败精神一致——记录剔除清单与理由,而不是静默丢弃。框架内部同样如此:RDKit 的 Lipinski 族描述符——供体数、受体数、可旋转键数——正是一组内置 SMARTS 的匹配计数(Landrum et al., 2026);第 4 章生成模型对警示子结构的惩罚打分,用的还是同一台匹配器。
骨架统计。1.3 节的骨架(scaffold)划分在此获得操作基础:Murcko 骨架由“环系加连接链”定义,剥离是图层面的操作;SMARTS 则用于定义骨架家族、检索骨架共享的分子。第 5 章做骨架划分(scaffold split)时,训练集与测试集的分桶依据正是这种图层面的骨架等价判断——比指纹相似严格,比精确相等宽容,刻度恰好落在“化学家认作同类”的位置。
反应中心识别。2.7 节的反应 SMARTS 把模板同时匹配到反应物与产物,匹配到的原子与键即反应中心。此处子结构匹配的角色从“检索”变为“标注”:匹配质量决定原子映射,原子映射决定反应数据的质量,进而决定一切反应学习模型的上限。三处应用共享同一个机理——本节开头的双射与剪枝,区别只在谓词写什么、匹配结果交给谁。
与 2.5 节的相似性检索对照,边界更清楚:子结构匹配是硬判据,要么命中要么不命中,答案由谓词完全决定、可复现可审计;指纹相似是软度量,给的是排序而非裁决。虚拟筛选中两者互补——先以松的相似性圈出候选池,再以严的子结构过滤收窄;或反过来,先钉死必需官能团,再用相似性在满足硬约束的分子里排序。
回到主线。子结构匹配把化学家的名词——官能团、骨架、警报——变成机器可执行的判据,是从分子表示(2.1、2.2)走向特征化与反应建模的枢纽。下一节换一条路:不再问“图里有没有什么”,而把整张图压缩成一组数——分子描述符。
关键术语
- 子结构匹配 (substructure search)
- 判定查询图能否作为子图嵌入目标分子图并枚举全部嵌入的检索技术。
- 子图同构 (subgraph isomorphism)
- 查询图与目标图子集之间的标签保持双射;其判定在最坏情形 NP 完全。
- 查询图 (query graph)
- 由 SMARTS 解析所得、待嵌入目标分子的模式小图。
- SMARTS (SMILES arbitrary target specification)
- 把 SMILES 的字面原子与键推广为谓词的子结构模式语言,不译。
- 原子谓词 (atom predicate)
- 元素、度数、氢数、电荷、环隶属等条件经逻辑算符组成的布尔表达式。
- 键谓词 (bond predicate)
- 键级与环隶属条件:~ 任意键、= 双或芳香、@ 环键、!@ 非环键。
- 递归 SMARTS (recursive SMARTS)
- 原子谓词内嵌完整模式,以表达原子的结构环境而非仅其属性。
- 回溯搜索 (backtracking search)
- 逐原子安排宿主、失败即回退的构造式搜索骨架,VF2 为代表。
- 剪枝 (pruning)
- 用标签、邻接、键型、单射性的局部检查提前放弃整棵搜索子树。
- 原子集去重 (uniquify)
- 把涉及同一原子集的多个匹配折叠为一个,把“嵌入方式”归并为“结构位置”。
- 药效团 (pharmacophore)
- 结合所需特征点(供体、受体、疏水、电荷、芳环)及其空间排布的抽象。
- 毒团警报 (toxicophore alert)
- 标记易致毒或干扰结构的警示子结构过滤器,PAINS 为其著名一类。
参考文献与延伸阅读
- Daylight Chemical Information Systems, Inc. SMARTS — A Language for Describing Molecular Patterns. Daylight Theory Manual(规范文档,第 4 章).
- Barnard JM. 1993. Substructure searching methods: old and new. Journal of Chemical Information and Computer Sciences 33:532–538.
- Cordella LP, Foggia P, Sansone C, Vento M. 2001. An improved algorithm for matching large graphs. In: Proceedings of the 3rd IAPR-TC15 Workshop on Graph-Based Representations in Pattern Recognition, Ischia, 149–159.
- Landrum G, et al. 2026. RDKit Documentation: SMARTS Support and Substructure Matching. RDKit 官方文档,2026.03 系列.
- Güner OF (ed.). 2000. Pharmacophore Perception, Development, and Use in Drug Design. La Jolla: International University Line(IUL Biotechnology Series).
- Baell JB, Holloway GA. 2010. New substructure filters for removal of pan assay interference compounds (PAINS) from screening libraries and for their exclusion in bioassays. Journal of Medicinal Chemistry 53:2719–2740.