ChEMBL SQL

Introduction

ChEMBL database를 활용하기 위해서는 여려 테이블에 흩어져 있는 정보를 통합해야 한다. SQL 명령어를 이용해 이러한 작업이 가능하다. 여기에서는 간단한 예제를 통해 ChEMBL에서 데이터를 획득하는 방법을 연습한다. 특히, Python을 이용해 프로그램을 통한 데이터베이스 활용 방법을 실습한다.

아래의 링크에서 ChEMBL에서 SQL 명령어를 참고할 수 있다. Oracle 기반이므로 MySQL을 이용하기 위해서는 약간의 수정이 필요하다.

https://chembl.gitbook.io/chembl-interface-documentation/frequently-asked-questions/schema-questions-and-sql-examples

Example 1 – 세균을 대상으로 하는 화합물 데이터 확보

아래 SQL script는 target 단백질이 ‘Bacteria’에 속하는 organism class에 해당하는 경우의 화합물 정보를 수집하는 명령어이다.

SELECT md.chembl_id AS compound_chembl_id,
cs.canonical_smiles,
act.standard_type,
act.standard_value,
act.standard_units,
td.chembl_id AS target_chembl_id,
td.organism,   td.pref_name
FROM target_dictionary td
  JOIN assays a ON td.tid = a.tid
  JOIN activities act ON a.assay_id = act.assay_id
  JOIN molecule_dictionary md ON act.molregno = md.molregno
  JOIN compound_structures cs ON md.molregno   = cs.molregno
  JOIN organism_class oc ON td.tax_id = oc.tax_id
    AND oc.L1 = 'Bacteria'

mysql client에 해당 script를 입력하면, 관련 데이터를 얻을 수 있다. 다만, 이 경우 매우 많은 데이터를 한번에 표기하게 되며, 실제로 이를 이용하는 것은 어려울 수 있다.

실제 데이터를 활용하기 위해서는 프로그램을 이용해 데이터를 얻고 분석해야 한다. 여기서는 Python을 이용해 데이터를 받는 방법을 실습한다.

Python을 이용한 데이터 확보

import pandas as pd
import mysql.connector

connection = mysql.connector.connect(
    host=<IP ADDRESS>,
    user=<USER>,
    port=<PORT>,
    password=<PASSWORD>,
    database='chembl_33'
)
cursor = connection.cursor()
sql = '''SELECT md.chembl_id AS compound_chembl_id,
cs.canonical_smiles,
act.standard_type,
act.standard_value,
act.standard_units,
td.chembl_id AS target_chembl_id,
td.organism,   td.pref_name
FROM target_dictionary td
  JOIN assays a ON td.tid = a.tid
  JOIN activities act ON a.assay_id = act.assay_id
  JOIN molecule_dictionary md ON act.molregno = md.molregno
  JOIN compound_structures cs ON md.molregno   = cs.molregno
  JOIN organism_class oc ON td.tax_id = oc.tax_id
    AND oc.L1 = 'Bacteria' limit 10;'''
cursor.execute(sql)
for e in cursor.fetchall():
    print(e)

pandas를 이용한 데이터 받기

Pandas는 데이터 관리에 특화된 Python library이다. 이를 이용해서 MySQL database에서 데이터를 table 형태로 받고 관리할 수 있어 널리 이용된다.

df = pd.read_sql(sql, connection)

Example 2 – 특정 단백질에 결합하는 화합물

두 번째 예로, 특정 단백질에 결합하는 화합물 전체 정보를 가져온다.

SQL script와 pandas를 이용해 데이터를 확보한다.

sql = """SELECT DISTINCT
  m.chembl_id                      AS compound_chembl_id,
  s.canonical_smiles,
  r.compound_key,
  act.standard_type,
  act.standard_relation,
  act.standard_value,
  act.standard_units,
  act.activity_comment,
  t.chembl_id                      AS target_chembl_id,
  t.pref_name                      AS target_name,
  t.target_type
FROM compound_structures s
  RIGHT JOIN molecule_dictionary m ON s.molregno = m.molregno
  JOIN compound_records r ON m.molregno = r.molregno
  JOIN docs d ON r.doc_id = d.doc_id
  JOIN activities act ON r.record_id = act.record_id
  JOIN assays a ON act.assay_id = a.assay_id
  JOIN target_dictionary t ON a.tid = t.tid
  JOIN target_components tc ON t.tid = tc.tid
  JOIN component_sequences cs ON tc.component_id = cs.component_id
    AND cs.accession = 'P08172'
    limit 100;
    """
df = pd.read_sql(sql, connection)

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top