RDKit
云原生数据仓库AnalyticDB PostgreSQL版提供RDKit插件,支持化学分子计算和化学分子检索等功能。该插件支持mol(描述分子类型)和fp(描述分子指纹)数据类型,并基于此支持比较运算、相似度计算(Tanimoto、Dice)和索引操作。本文为您介绍RDKit插件的基本用法。
使用限制
内核版本为V7.2.1.2及以上的AnalyticDB PostgreSQL 7.0版实例。
暂不支持AnalyticDB PostgreSQL版Serverless模式。
注意事项
mol数据类型的输入、输出函数遵循简化分子线性输入规范(SMILES)。fp数据类型的输入、输出功能遵循bytea(存储二进制数据的字段类型)格式。不支持trigger的使用。
安装与卸载
RDKit插件安装与卸载,请提交工单联系技术支持操作。提交工单时,请提供实例ID以及需要操作的数据库名称。
默认参数配置
postgres=# show rdkit.tanimoto_threshold ;
rdkit.tanimoto_threshold
--------------------------
0.5
(1 row)
postgres=# show rdkit.dice_threshold;
rdkit.dice_threshold
----------------------
0.5
(1 row)基本用法
更多RDKit插件SQL操作请参见RDKit SQL。
创建和验证分子
-- 检查 SMILES 字符串是否有效
SELECT is_valid_smiles('c1ccccc1');
-- 从 SMILES 创建分子
SELECT mol_from_smiles('c1ccccc1');
-- 将分子转换回 SMILES
SELECT mol_to_smiles(mol_from_smiles('c1ccccc1'));创建和验证分子查询
-- 检查 SMARTS 字符串是否有效
SELECT is_valid_smarts('c1ccc[n,c]1');
-- 从 SMARTS 创建分子查询
SELECT qmol_from_smarts('c1ccc[n,c]1');
-- 将查询转换回 SMARTS
SELECT mol_to_smarts(qmol_from_smarts('c1ccc[n,c]1'));创建包含分子的表
数据准备,可以使用RDKit测试数据,保存至本地data文件。
-- 创建包含分子的表
CREATE TABLE pgmol (id int, m mol);
-- 从文件加载数据
\copy pgmol from 'path/to/your/data';子结构匹配
-- 使用 @> 操作符进行子结构搜索(分子包含查询)
SELECT count(*) FROM pgmol WHERE m @> 'c1ccccc1';
-- 使用 <@ 操作符进行子结构搜索(查询包含分子)
SELECT count(*) FROM pgmol WHERE 'c1cccnc1' <@ m;
-- 基于查询的子结构匹配
SELECT count(*) FROM pgmol WHERE m @> qmol_from_smarts('c1ccc[n,c]c1');指纹生成和相似性
-- 生成各种类型的指纹
SELECT rdkit_fp(m) AS f FROM pgmol LIMIT 1;
SELECT morgan_fp(m, 1) AS f FROM pgmol LIMIT 1;
SELECT maccs_fp(m) AS f FROM pgmol LIMIT 1;
SELECT torsion_fp(m) AS f FROM pgmol LIMIT 1;
SELECT atompair_fp(m) AS f FROM pgmol LIMIT 1;
-- 创建带有指纹的表
SELECT id, rdkit_fp(m) AS f INTO pgbfp FROM pgmol;
SELECT id, morgan_fp(m,1) AS f INTO pgsfp FROM pgmol;
-- 设置相似性阈值
SET rdkit.tanimoto_threshold=0.5;
SET rdkit.dice_threshold=0.5;
-- 计算分子之间的相似性
SELECT
id,
tanimoto_sml(rdkit_fp('C1C(OC2=CC(=CC(=C2C1=O)O)O)'::mol), f)
FROM pgbfp
WHERE rdkit_fp('C1C(OC2=CC(=CC(=C2C1=O)O)O)'::mol) % f
ORDER BY id
LIMIT 10;
-- 使用 Dice 相似性
SELECT
id,
dice_sml(rdkit_fp('C1C(OC2=CC(=CC(=C2C1=O)O)O)'::mol), f)
FROM pgbfp
WHERE rdkit_fp('C1C(OC2=CC(=CC(=C2C1=O)O)O)'::mol) % f
ORDER BY id
LIMIT 10;索引支持
mol和fp的比较运算操作支持Btree索引、Hash索引。例如:CREATE INDEX molidx ON pgmol(m);mol的%、#、@>、<@操作和fp结构的%、#操作支持Gist索引和GIN索引。例如:CREATE INDEX molidx_gist ON pgmol USING gist(m); CREATE INDEX bfp_gin ON pgbfp USING gin(f); CREATE INDEX bfp_gist ON pgbfp USING gist(f);
操作符
操作符 | 描述 |
| 当Tanimoto相似度计算结果小于GUC配置参数 |
| 当Dice相似度计算结果小于GUC配置参数 |
| 如果操作符 |
| 如果操作符 |
| 精确结构匹配。 |