このトピックでは、ApsaraDB RDS for PostgreSQLのRDKitプラグインを使用して、分子コンピューティングや検索などの機能を実装する方法について説明します。
前提条件
RDSインスタンスはPostgreSQL 12を実行します。背景情報
RDKitは、分子タイプを記述するために使用されるmolデータ型と、分子フィンガープリントを記述するために使用されるfpデータ型の2つのデータ型をサポートします。 これにより、比較計算、Tanimoto係数とDice係数に基づく類似度計算、およびGiSTインデックス付けが可能になります。
RDKitでサポートされているSQL文の詳細については、RDKit SQLをご参照ください。
注意事項
- molデータ型に基づく入力および出力関数は、簡略化された分子入力ラインエントリ仕様 (SMILES) に準拠しています。
- fpデータ型に基づく入出力関数は、バイナリデータの格納に使用されるbytea形式に準拠しています。
RDKitプラグインの作成
postgres=# create extension rdkit;
拡張の作成
デフォルトのパラメーター設定
postgres=# show rdkit.tanimoto_threshold;
rdkit.tanimoto_threshold
--------------------------
0.5
(1行)
postgres=# show rdkit.dice_threshold;
rdkit.dice_threshold
----------------------
0.5
(1行)
サポートされるインデックス
- molおよびfpデータ型に基づく比較計算操作では、Bツリーおよびハッシュインデックスがサポートされます。 例:
インデックスmolidx ON pgmol (mol) を作成します。CREATE INDEX molidx ON pgmol (fp);
- GiSTインデックスは、molとfpのデータ型に基づく操作でサポートされます。「mol % mol」、「mol # mol」、「mol @> mol」、「mol <@ mol」、「fp % fp」、および「fp # fp」。例:
CREATE INDEX molidx ON pgmol USING gist (mol);
サンプル関数
- tanimoto_sml関数は、Tanimoto係数に基づいて類似度を計算する。
postgres=# \df tanimoto_sml 関数の一覧 スキーマ | 名前 | 結果データ型 | 引数データ型 | 型 -------- -------------- ------------------ --------------------- --------- public | tanimoto_sml | 倍精度 | bfp、bfp | func public | tanimoto_sml | 倍精度 | sfp, sfp | func (2行)
- dice_sml関数は、Dice係数に基づいて類似度を計算します。
postgres=# \df dice_sml 関数の一覧 スキーマ | 名前 | 結果データ型 | 引数データ型 | 型 ------- ---------- ------------------ --------------------- -------- public | dice_sml | 倍精度 | bfp、bfp | func public | dice_sml | 倍精度 | sfp, sfp | func (2行)
- 2番目の引数が1番目の引数のサブ構造である場合、substruct関数はTRUE値を返します。
postgres=# \dfサブ構造 関数の一覧 スキーマ | 名前 | 結果データ型 | 引数データ型 | 型 ------- ----------- ------------------ --------------------- -------- public | substruct | boolean | mol, mol | func public | substruct | boolean | mol, qmol | func public | substruct | boolean | 反応、反応 | func (3行)
基本操作
mol % mol
およびfp % fp
Tanimoto係数に基づいて計算された類似度が、rdkit.tanimoto_threshold GUC変数の値よりも小さい場合、TRUE値が返されます。
mol # mol
およびfp # fp
Dice係数に基づいて計算された類似度がrdkit.dice_threshold GUC変数の値より小さい場合、TRUE値が返されます。
mol @> mol
左オペランドに右オペランドが含まれている場合、TRUE値が返されます。
mol <@ mol
右オペランドに左オペランドが含まれている場合、TRUE値が返されます。