RDKit

更新时间:
复制为 MD 格式

云原生数据仓库AnalyticDB PostgreSQL提供RDKit插件,支持化学分子计算和化学分子检索等功能。该插件支持mol(描述分子类型)和fp(描述分子指纹)数据类型,并基于此支持比较运算、相似度计算(Tanimoto、Dice)和索引操作。本文为您介绍RDKit插件的基本用法。

使用限制

  • 内核版本为V7.2.1.2及以上的AnalyticDB PostgreSQL 7.0实例。

    说明

    您可以在控制台实例的基本信息页查看内核小版本。如不满足上述版本要求,需要您升级内核小版本

  • 暂不支持AnalyticDB PostgreSQLServerless模式

注意事项

  • 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;

索引支持

  • molfp的比较运算操作支持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);

操作符

操作符

描述

  • mol % mol

  • fp % fp

Tanimoto相似度计算结果小于GUC配置参数rdkit.tanimoto_threshold时,该操作返回结果为TRUE。

  • mol # mol

  • fp # fp

Dice相似度计算结果小于GUC配置参数rdkit.dice_threshold时,该操作返回结果为TRUE。

mol @> mol

如果操作符@>左边对象包含右边对象,该操作返回结果为TRUE。

mol <@ mol

如果操作符<@右边对象包含左边对象,该操作返回结果为TRUE。

mol @= mol

精确结构匹配。