postgresql rdkit 相关场景搜索 - Wangxiaoman/tech-note GitHub Wiki
可用数据导入
csv数据写入
-- 数据表结构
create table c_smiles(
id int,
smiles varchar(4096),
source varchar(200)
);
-- 导入数据命令
\copy c_smiles FROM 'xxxx' DELIMITER E'\t' CSV;
-- 导入结果查询
select count(1) from c_smiles;
PostgreSQL支持的分子指纹
postgresql中支持的指纹函数:
- layered_fp(mol):另一种rdkit原创指纹,官方文档的解释是它一种子结构指纹,与rdkit拓扑子图的生成步骤一致,但根据子图生成指纹向量的过程有所不同。在子结构指纹类别中, layered指纹的表现不如pattern指纹,因此不像其他指纹这么被人所熟知。
- torsionbv_fp(mol):对分子计算topological-torsion的bfp(bit fingerprint)型指纹
- torsion_fp(mol):计算topological-torsion的sfp(sparse fingerprint)型指纹
- morganbv_fp(mol, int default 2):计算指定半径(默认为2)的morgan型bfp指纹
- morgan_fp(mol, int default 2):计算morgan的sfp指纹
- featmorganbv_fp(mol, int default 2):计算morgan FCFP(用官能团归类)的bfp指纹
- featmorgan_fp(mol, int default 2):计算morgan FCFP的sfp指纹
- atompairbv_fp(mol):atompair的bfp指纹
- atompair_fp(mol):atompair的sfp指纹
- rdkit_fp(mol):rdkit的拓扑指纹
- maccs_fp(mol):预定义的MACCS指纹
分子指纹的概念以及应用
分子指纹定义:分子指纹就是一种分子的抽象表征,它将分子转化(编码)为一系列比特串(即比特向量,bit vector),然后可以很容易地在分子之间进行比较。典型的流程是将提取分子的结构特征、然后哈希(Hashing)生成比特向量。
分子相似性计算规则
评价两个分子之间相似的算法有如下类型(计算分子指纹相似性,行业标准是Tanimoto系数)
其中,给定两个化合物A和B的指纹,m等于指纹中存在的总位数,a、b分别等于A、B中比特值为1的位数,c等于A和B中公共的比特值为1的位数
方法 | 表达式 | 取值范围 |
---|---|---|
Tanimoto/Jaccard coefficien | c/(a+b-c) | 0-1 |
Euclidean distance | sqrt(a+b-2c) | 0-N |
City-block/Manhattan/Hamming distance | a+b-2c | 0-N |
Dice coefficien | 2c/(a+b) | 0-1 |
Cosine similarity | c/sqrt(ab) | 0-1 |
Russell–RAO coefficien | c/m | 0-1 |
Forbes coefficien | cm/ab | 0-1 |
Soergel distance | (a+b-2c)/(a+b-c) | 0-1 |
计算效率
硬件资源:4C16G,SSD,因为mol处理和指纹计算应该都是间接使用RDKIT,所以CPU计算会是耗时的主要部分 基于千万数据,mol生成,分子指纹计算的时间 smiles to mol对象 大概需要时间:56min
-- 生成mol
select * into c_mols from (select id, mol_from_smiles(smiles::cstring) m,source from c_smiles) tmp where m is not null;
生成指纹
计算指纹大概需要时间:45分钟 索引创建时间:4分钟
-- 计算分子指纹
select id, m, morganbv_fp(m) as mfp2, featmorganbv_fp(m) as ffp2,source into c_mols_fps from c_mols;
-- 增加索引
create index fps_mfp2_idx on c_mols_fps using gist(mfp2);
create index fps_ffp2_idx on c_mols_fps using gist(ffp2);
torsionbv_fp这种分子指纹计算会报错,所以上面没有生成torsionbv 这类分子指纹 ERROR: makeTopologicalTorsionBFP: Unknown exception
相似性检索
带尖括号的百分号"<%>":使用tanimoto最近邻搜索,对应上面列表第一种算法
带尖括号的井号"<%>":使用dice最近邻搜索,对应上面的第二种算法 ECFP搜索例子 搜索SQL如下,使用ECFP进行搜索,大概执行时间为10S
select m, mfp2<%>morganbv_fp('C1=CC=C2C=CC(C3=CC=CC=C3)=CC2=C1') knn from c_mols_fps order by knn asc limit 10;
morgan FCFP(用官能团归类)搜索例子
select m, ffp2<%>featmorganbv_fp('C1=CC=C2C=CC(C3=CC=CC=C3)=CC2=C1') knn from c_mols_fps order by knn asc limit 10;
组合查询 对于包含手性结构条件下的相似性分子
select m, ffp2<%>featmorganbv_fp('C1=CC=C2C=CC(C3=CC=CC=C3)=CC2=C1') knn from c_mols_fps where m@>'C1=CC=C2C=CC=CC2=C1' order by knn asc limit 10;
对于smarts匹配下的相似性搜索
select m, ffp2<%>featmorganbv_fp('C1=CC=C2C=CC(C3=CC=CC=C3)=CC2=C1') knn,source from c_mols_fps where m@>mol_adjust_query_properties('C1=CC=C2C=CC([*])=CC2=C1') order by knn asc limit 20;