第二章 · 2.3

2.3 SMARTS 与子结构匹配:在分子图里搜索模式

SMARTS and Substructure Search
本节把“分子是否含有某子结构”形式化为子图同构,即查询图到目标图子图的标签保持单射嵌入,说明其最坏情形 NP 完全、而分子图的小规模与强标签使回溯剪枝在实践中可行;继而引入 SMARTS——把 SMILES 的字面原子与键升级为谓词的模式语言——借苯环、氢键受体与酰胺键剖析谓词宽窄,最后落到药效团、结构过滤与反应中心识别。

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)。φ 是单射,因而只在 VQ 与它的像 φ(VQ) 之间构成双射;查询键各自映到一条目标键,键集由原子对唯一确定。像原子之间还可以存在查询没有的额外键——三原子路径查询可以嵌入三角形的三个顶点,多出的那条环边并不妨碍命中。若进一步要求“查询未写的边,目标的像原子之间也不得有”,那是更强的诱导子图同构,是另一种匹配语义。

\[\varphi: V_{Q} ↪ V_{T} \quad P_{v}(\ell(\varphi(v))) = \text{真} \quad (u, v) \in E_{Q} \Longrightarrow (\varphi(u), \varphi(v)) \in E_{T}\]
(2.3-1)Pv 为查询原子 v 携带的谓词(元素、度数、电荷等),ℓ(φ(v)) 为宿主原子的属性束。第三条要求边的存在与键级同时满足。蕴含是单向的——这正是“子图”语义:目标允许拥有查询未提及的原子、键与邻居。
酰胺查询 C(=O)N 嵌入乙酰苯胺目标图:匹配把查询原子与键一一嵌入目标,像原子可带额外邻居与额外键 查询图 Q:C(=O)N 目标图 T:乙酰苯胺 CC(=O)Nc1ccccc1 φ(q1)=t3 φ(q2)=t2 φ(q3)=t4 O C N q1 q2 q3 c c c c c c C C O N t1 t2 t3 t4 匹配 φ 把查询原子一一对应到目标原子:q2 的两条键分别映到键级相容的目标键(C=O 双键、C–N 单键), 虚线弧标出三个原子的对应。像原子之间还可以有查询没有的额外键——t2 连甲基、t4 连苯环,均不妨碍命中。
图 2.3-1 子结构匹配的嵌入语义。查询图 C(=O)N(左)嵌入目标分子乙酰苯胺(右,粗线与蓝圈为命中的原子与键)。匹配只要求查询的全部原子与键在目标中找到像,不要求目标原子“除此之外别无邻居”,也不要求像原子之间“别无额外键”;单向蕴含正是子图语义的形式表达(式 2.3-1)。

复杂性的最坏消息必须先讲清楚:子图同构判定在任意标注图上是 NP 完全问题,任凭标签失去区分度时,搜索空间随查询规模阶乘式膨胀(Barnard, 1993)。分子图却自带三重“驯化”条件。其一,小:药物分子的重原子数多在几十以内,查询规模 k 更小,朴素枚举本身基数有限。其二,稀疏:度数受化合价约束,典型药物样有机分子里重邻居数不过三四,任何邻接检查只触及常数个候选——注意这是经验先验而非上界,高价中心并不罕见,PF₅ 的磷有五个、SF₆ 的硫有六个重邻居。其三,标签强:C、N、O、S 等十余种常见元素天然把原子集切成小块,元素谓词在第一步就砍掉绝大多数宿主候选。

\[P(n, k) = n(n-1) \cdots (n-k+1) \longrightarrow \text{标签剪枝后} \le \prod_{v \in V_{Q}} m_{v}\]
(2.3-2)P(n, k) 为朴素枚举的全部单射数;mv 为目标中与查询原子 v 的标签相容的原子数。例:k=6 的苯环查询落入 n=30 的分子,P(30, 6) ≈ 4.3×10⁸;若目标仅 12 个碳,标签剪枝后 ≤ 12⁶ ≈ 3.0×10⁶,再叠上邻接与键型检查,实际的存活分支还要少几个量级。

三重条件是经验先验,不是复杂度保证。刻意构造的稠环大分子——富勒烯衍生物、树枝状聚合物——既大又高度对称,匹配耗时明显上升;生产系统为此设置超时与放弃策略,把极端分子记入异常清单而非任其拖垮检索。多数应用看不见这一点,正因为分子图的世界通常站在先验的一侧。

实际算法把“整图判定”拆成“逐步构造”。回溯搜索(backtracking search)的骨架是:给查询原子排一个次序,逐个为其挑选宿主;每一步只在“与已安置邻居相邻、且标签与度数相容”的目标原子里选,无候选即退回上一步换一个选择。剪枝(pruning)的威力来自局部性:元素不符、度数不足、键型不合、单射冲突,每项检查只涉及常数个原子,代价极小,而每剪一刀放弃的是一整棵子树。VF2 算法在这一骨架上加入前看规则——完整匹配尚未形成时即检验“剩余候选是否还够”,并按邻接关系动态排序查询原子(Cordella et al., 2001)。RDKit 的子结构匹配器属于 VF2 一族,另加环-环约束等化学特有的加速(Landrum et al., 2026)。图 2.3-2 展开这棵搜索树。

酰胺查询的回溯搜索树:逐层为查询原子选宿主,元素、邻接、单射性检查剪掉整棵子树,存活路径到达完整匹配 第 1 层 q1 = O 第 2 层 q2 = C 第 3 层 q3 = N 根:∅ × t1(甲基 C) 剪枝:元素谓词不符 t3(O)— 存活 × t4(N) 剪枝:元素谓词不符 × t1(甲基 C) 剪枝:与 q1 宿主 t3 不相邻 t2(羰基 C)— 存活 × t3(O) 剪枝:t3 已被 q1 占用(破坏单射) t4(N)— 完整匹配 存活路径给出嵌入 (q1, q2, q3)→(t3, t2, t4)。每个 × 处,标签、邻接、键型、单射性检查在常数代价内完成,放弃的是一整棵子树。
图 2.3-2 回溯搜索树与剪枝(以图 2.3-1 的查询与目标为例)。逐层为查询原子 q1、q2、q3 挑选宿主:虚线框是被局部检查杀死的分支,实线路径是唯一的存活匹配。第三层展示了单射性剪枝——已被占用的宿主不能再要。分支因子被标签与邻接约束压到个位数,这正是 NP 完全问题在分子图上“实际可行”的机理。
习题 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) 先划清论证的边界:各层分支因子的乘积与层的排列次序无关,单看“完整路径的条数”排不出先后。真正的收益有两处。其一,搜索树的前缀节点数是 1+b₁+b₁b₂+b₁b₂b₃+⋯——把最小的分支因子放到最前,每一级前缀都被最小的因子压缩;其二,失败越早发生,放弃的子树越大——稀有标签对应的层分支最少,先匹配它,一旦失败,后面的整棵子树都不必展开。因此“稀有优先”是合理的启发式,但不是由 (1)(2) 推出的定理:最优次序还依赖度数、环条件与已匹配邻接,VF2 的动态排序正是综合这些因素的工程实现,而非单一的标签稀有度规则。

2.3.2 匹配的语义:嵌入、多重匹配与计数

工程接口把匹配分成两个问题。存在性——“这个分子含不含该模式”——返回布尔值,服务于过滤:一个 SMARTS 划过整个化合物库,留下命中的分子。枚举——“命中在哪几个原子、一共有几处”——返回原子编号元组的列表,服务于定位与标注:找出反应发生的原子、标出取代位置、统计官能团个数。两个问题共用同一台匹配器,语义却不同:研究者要清楚自己问的是哪一个。

多重匹配是对称性的直接后果。同一子结构在同一分子里往往有许多个合法嵌入:苯环查询嵌入甲苯,环自身的六个旋转与两个反射个个都保标签保键,共 12 个匹配。若研究目标是“官能团个数”,把这 12 个全数出来就会把一个苯环数成十二个;原子集去重(uniquify)把涉及同一原子集的匹配折叠为一个,12 归 1。两个数都对——一个数“嵌入方式”,一个数“结构位置”,错只在问非所答。

枚举的代价也随对称度增长。全部嵌入的个数等于模式在目标里的对称嵌入数,高对称骨架——大环、稠环、多取代的均三嗪——上可到几十上百;再放到百万级库上逐分子枚举,开销可观。此时先收紧查询(补上度数、氢数、连接数谓词)往往比换更快的匹配器更有效:谓词每收窄一分,图 2.3-2 那棵搜索树的每一层都少一截分支,收益是乘法性的。工程上还有一道容易忽略的闸:RDKit 的枚举接口默认 maxMatches=1000,达到上限即静默停止——即便 uniquify=False,默认也不是无上限的完全枚举,高对称体系要数“数学意义上的全部嵌入”须显式调大这个参数。

匹配对象是原子的一一嵌入:接口返回原子编号的元组,查询键随原子对唯一确定。这个看似朴素的性质支撑了很多下游用法——把匹配原子写进分子属性即可完成原子标注,供描述符计算、可视化与 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,且不带 +1 电荷”:逗号先并列元素,分号再对整组追加条件。两种 AND 的并存正是 Daylight 用来取代分组括号的设计——SMARTS 的原子表达式里没有分组算符,一切组合都靠优先级表达:[#6&R](既是碳又在环上)先算 &;若要“碳,或者任何环原子”须写 [#6,R]。键谓词的记号少而精,与 SMILES 共用一套符号、语义却更严:省略键符号按“单键或芳香键”处理(与 SMILES 的省略约定一致);- 明确要求单键,= 双键,# 三键,: 芳香键;~ 才是任意键(通配);@ 环键(键在环上),!@ 非环键。例如 [#6]-!@[#6] 表示两个以非环单键相连的碳——联苯两环之间正是这样的单键,尽管两端都是芳香碳。递归 SMARTS(recursive SMARTS)再进一步:原子谓词里嵌一个完整模式,如 [$([#7]-[#6]=[#8])] 表示“本原子是连着羰基碳的氮”——谓词谈论的不再是原子的属性,而是它的结构环境。还有一处工程细节易被忽略:RDKit 的子结构接口默认不做立体过滤(useChirality=False),SMARTS 里写了 @/@@ 也照样命中对映异构体,需要立体语义时须显式开启。

优先级是初学阶段最常踩的坑,值得用一个对子钉牢:[#6,R;H1] 是“(碳,或任何环原子)且带一个氢”——分号最后算,先把左边整组并列起来;[#6;R,H1] 是“碳,且(在环中,或带一个氢)”——分号把碳隔在外面,逗号只在它右边的小组内做或。字符完全相同,只因分号与逗号的位置不同,语义已分道扬镳。拿不准时不要想着加括号——方括号内没有分组括号,圆括号另有含义(分支、组分分组、递归 $()),照 C 语言的直觉乱加会直接解析失败——正确做法是用分号显式切分层次,或把两种语义拆成两条模式分别写。

表 2.3-1SMARTS 原子谓词的常用成分(Daylight 理论手册;RDKit 另有扩展,Landrum et al., 2026)
成分谓词示例语义
元素与原子序数C, n, #6, [#8]大写脂族、小写芳香、原子序数 #n
度与连接数D2, d2, X3D 为显式连接数(隐式氢不计,显式氢原子计入);d 为非氢连接数(RDKit 扩展);X 为含氢总连接数
氢计数H1, !H0H 为总氢数;h 为隐式氢数
总价(键级和)v4该原子键级总和(v,隐式氢的贡献计入)
形式电荷+1, -1, !+带指定电荷;!+ 严格说是“排除 +1”,并不排除 +2、+3
芳与脂a, A芳香原子 / 脂族原子
环隶属R1, r6属于 R 个 SSSR 环 / 所在最小 SSSR 环的大小
手性@, @@立体中心的两种构型标签
方法

写 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(=O)~N;而 C(=S)N 的硫代酰胺不会命中,因为 =O 是字面谓词。收紧一步得 [CX3](=[OX1])-[NX3]:羰基碳连接数 3、氧连接数 1、酰胺氮总连接数 3——一级、二级、三级酰胺都可能满足,取决于氢与重原子的组合——连字符把 C–N 明确钉死为单键。官能团检索的意义正在于此——把化学家的名词变成可执行、可复现的结构判据,而“数出分子里有几个酰胺”就是最朴素的结构描述符(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)。配体之所以结合靶点,化学的讲法是“几个功能位点以正确的空间排布各司其职”;药效团就是这段话的形式化。

子结构匹配与药效团是同一家族的两种约束匹配,约束空间却不同,并非谁是谁的退化特例。子结构匹配约束原子身份与共价拓扑——元素、键级、连接、环归属;药效团先把局部结构抽象成功能角色——不再问“是不是氮”,只问“是不是受体”——再约束角色之间的距离关系(拓扑距离区间,或三维的距离、夹角、二面角)。把药效团的距离约束全部去掉,得到的是“只问特征存在与否”的特征查询,它不会自动变回一张带键级的子结构图;反过来,子结构匹配也从不要求建立供体、受体这类功能角色。两者在实现上确有真实的连接:药效团的特征判据往往就用 SMARTS 书写——“受体”这一角色正可以定义为 2.3.4 那套结构判据的收窄版;RDKit 把只有特征判据、暂无距离约束的中间形态称作 proto-pharmacophore。匹配对象由此从分子图变为特征图,判定从同构检查变为“特征对应 + 几何校验”。

三维药效团检索因此是两步合成:先在构象集合上做特征图匹配,得到候选的特征对应;再用距离、角度约束筛掉不合格的构象。图匹配给出“谁对应谁”,几何给出“够不够格”——两个模块各司其职,恰是 2.3.1 的搜索与 2.3.3 的谓词在三维世界的延伸(图 2.3-3)。对机器学习,这一节留下两点:药效团特征计数与药效团指纹是现成的特征来源;同时它划出了 2D 匹配的边界——无几何、无能量,三维信息要么显式建模,要么明确放弃。

药效团把活性抽象为特征点与几何约束:供体 D、受体 A、疏水中心 H、芳环中心 R 及距离区间 特征点类型 D 氢键供体(donor) A 氢键受体(acceptor) H 疏水中心(hydrophobe) R 芳环中心(ring) 特征点是功能角色,不是元素:D 由供体子结构 判据指认,A 的判据即 2.3.4 的受体模式。 一个四点药效团(特征图 + 距离约束) D A H R d(D–A) ∈ 4.5–5.5 Å d(D–H) ∈ 6–8 Å d(A–H) ∈ 5–7 Å R 与 D、A 的距离只设上界(示意图,非具体体系)。 检索 = 特征图匹配(谁对应谁)+ 几何校验(距离够不够格); 特征判据常以 SMARTS 书写——与 2D 子结构匹配是近亲,但约束空间不同。
图 2.3-3 药效团的特征点与几何约束(示意)。左:特征点是把原子抽象为功能角色后的产物,每个角色由一组子结构判据指认——受体的判据正是 2.3.4 的模式。右:四点药效团由特征图(节点为角色、边为约束)定义,距离取区间而非定值,以容纳构象涨落与不同配体。三维检索先做特征图匹配、再做几何校验;只有特征判据、距离约束全部缺席的情形(proto-pharmacophore)是 2D 子结构匹配的近亲,但两者约束空间不同、并不等同。

2.3.6 流水线中的位置:过滤、骨架与反应中心

结构过滤。把领域知识固化成一批 SMARTS,在建模之前清理数据,是子结构匹配最广泛的应用。PAINS(pan-assay interference compounds)过滤器标记那些在无关化验里反复“显活性”的干扰结构——荧光团、反应性亲电体、聚集倾向骨架(Baell & Holloway, 2010);毒团警报(toxicophore alert)则标记 Michael 受体片段、芳香硝基、肼等易致毒警示子结构。两类过滤器目标不同——前者管化验干扰,后者管毒性——但工程地位一样:命中不等于无效或有毒,只是进入人工复核的信号。与 2.1 节的早失败精神一致——记录剔除清单与理由,而不是静默丢弃。框架内部同样如此:RDKit 的 Lipinski 族描述符——供体数、受体数、可旋转键数——底层正是一组内置 SMARTS 的结构规则(Python 接口转入编译的描述符实现,Landrum et al., 2026);第 4 章生成模型对警示子结构的惩罚打分,用的还是同一台匹配器。

骨架统计。1.3 节的骨架(scaffold)划分在此获得操作基础:Murcko 骨架由“环系加连接链”定义,剥离是图层面的操作;SMARTS 则用于定义骨架家族、检索骨架共享的分子。第 5 章做骨架划分(scaffold split)时,训练集与测试集的分桶依据正是这种图层面的骨架等价判断——比指纹相似严格,比精确相等宽容,刻度恰好落在“化学家认作同类”的位置。

反应中心识别。2.7 节的反应 SMARTS 把模板同时匹配到反应物与产物,但匹配到的原子集通常只是“反应位点的上下文”——模板为了选择性,常把不参与变化的邻居原子也写进去。反应中心要由反应物与产物之间真正变化的原子与键比对得出:断键、成键、键级改变、连接数或元素改变;RDKit 的 changed-atom 判定正是按这些差异定义的。至于原子映射,方向恰好相反:反应 SMARTS 里的映射号(如 [C:1])是模板自己给出的反应物—产物对应关系,用来约束匹配,而不是匹配算出来的产物;给已观测的反应数据补全原子映射,则是另一个专门的映射问题(2.7 节)。子结构匹配在此的角色从“检索”变为“标注”——标注的质量决定反应数据的质量,进而决定反应学习模型的上限。三处应用共享同一个机理——本节开头的嵌入与剪枝,区别只在谓词写什么、匹配结果交给谁。

与 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)
结合所需特征点(供体、受体、疏水、电荷、芳环)及其空间排布的抽象;特征判据常以 SMARTS 书写。
毒团警报 (toxicophore alert)
标记易致毒警示子结构的过滤器;与针对化验干扰的 PAINS 是两类问题。
PAINS (pan-assay interference compounds)
化验干扰化合物的结构警报:标记在无关化验中反复显活性的干扰骨架,命中的是干扰嫌疑而非毒性。

参考文献与延伸阅读

  1. Daylight Chemical Information Systems, Inc. SMARTS — A Language for Describing Molecular Patterns. Daylight Theory Manual(规范文档,第 4 章).
  2. Barnard JM. 1993. Substructure searching methods: old and new. Journal of Chemical Information and Computer Sciences 33:532–538.
  3. 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.
  4. Landrum G, et al. 2026. RDKit Documentation: SMARTS Support and Substructure Matching. RDKit 官方文档,2026.03 系列.
  5. Güner OF (ed.). 2000. Pharmacophore Perception, Development, and Use in Drug Design. La Jolla: International University Line(IUL Biotechnology Series).
  6. 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.