ここでは ChEMBL のデータを取り込んでみる。
対象は chembl_21.sdf.gz
* ftp.ebi.ac.uk から取得(releases 21)。$$$$の件数で1,583,897件
chembl_21.sdf.gzは構造式のMDLMOLとプロパティーとしてのchembl_idだけで構成されている。
RDKit/Cartridge/PubChemと同じようにするため、RDKitから作られるsmilesを入れるフィールド(RDKit_smiles)を持つテーブルchembleを用意した
フィールド名 | 型 | 制約 | 備考 |
MDLMOL | text | M ENDまでの構造式(MDL MOL形式) | |
RDKit_smiles | mol | RDKitによりMDLMOLから作成 | |
chembl_id | varchar(30) | primary key | 主キー |
っで、作成するSQLは下記とした
CREATE TABLE chemble (
MDLMOL text, --- MDL MOL形式
RDKit_smiles mol, --- RDKitのデータ型
chembl_id varchar(30) primary key --- ID
);
RDKit/Cartridge/PubChem/登録と同じように python script(ChEMBLReg.py) を作ってみた
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| - ! |
|
これを使ってchembl_21.sdf.gzを chemble にインポートした。
[root@c ~]# python ChEMBLReg.py chembl_21.sdf.gz
途中、
[01:14:27] S group SUP ignored on line 105325440
[01:15:07] Explicit valence for atom # 36 F, 3, is greater than permitted
[01:15:07] ERROR: Could not sanitize molecule ending on line 106434949
[01:15:07] ERROR: Explicit valence for atom # 36 F, 3, is greater than permitted
:
などエラーが発生したが、その部分は飛ばしてインポートが進み、
[root@c ~]# psql -U caster -d chemdb
psql (9.3.4)
Type "help" for help.
chemdb=> \dti+ chemble*
リレーションの一覧
スキーマ | 名前 | 型 | 所有者 | テーブル | サイズ | 説明
----------+--------------+--------------+--------+----------+---------+------
public | chemble | テーブル | caster | | 1593 MB |
public | chemble_pkey | インデックス | caster | chemble | 64 MB |
(2 行)
chemdb=> select count(*) from chemble;
count
---------
1583849
(1 行)
chemdb=>
と1,583,849件のインポートに成功した。
元が1,583,897件なので、48件入らなかった
RDKitは基本がsmilesなので、そのsmilesをMDLMOLフィールドを使って作成します。
[root@c ~]# psql -U caster -d chemdb
psql (9.2.15)
"help" でヘルプを表示します.
chemdb=> \d chemble
テーブル "public.chemble"
列 | 型 | 修飾語
--------------+-----------------------+----------
mdlmol | text |
rdkit_smiles | mol |
chembl_id | character varying(30) | not null
インデックス:
"chemble_pkey" PRIMARY KEY, btree (chembl_id)
chemdb=> \timing
タイミングは on です。
chemdb=>
chemdb=> UPDATE chemble SET rdkit_smiles = mol_from_ctab(mdlmol::cstring);
UPDATE 1583849
時間: 1851406.780 ms
chemdb=>
1851406.780 msは、1851secで、つまりは30minほどで完了
このままでも一応構造式検索はできるが、RDKit_smilesフィールドからfingerprintを作成して構造式検索をより早く行わせる。fingerprintは別テーブルに収めてもいいが、ここではchembleテーブル内に用意した。
1 2 3 4 5 6 7 |
|
次に、追加したフィールドに各種のfingerprintで更新する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
と4GBを超えた。場合によってはfingerprintを別テーブルで管理するのが宜しいかもしれない。
別テーブルにするには SELECT-INTO 文を使って、
1 2 3 4 5 6 7 |
|
とかにする。
実行時間を計測するには \timing を使う
intel N3700(1.60GHz)なマシンでは、
1 2 3 4 5 6 7 |
|
176240.703 msは 2.9373 分。当然早いマシンではもっと短縮される。
でもpostgreSQLのLIMITオプションを使うと
1 2 3 4 5 6 7 8 9 |
|
と0.7秒に短縮。次の10件を表示させるにはOFFSETオプションを用いて
1 2 3 4 5 6 7 8 9 |
|
とすればいいみたい。
類似構造検索
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1.6秒で帰ってきた