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;