You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于RDKit在Python数据库中实现阈值过滤的分子相似度搜索

数据库分子相似度搜索及结果表格输出

核心需求

基于SMILES字符串生成Morgan指纹,计算与目标分子的相似度,筛选出相似度高于指定阈值的分子,按相似度降序输出结果表格。

原代码优化方案

你提供的代码存在重复计算相似度的问题(WHERE子句和SELECT子句重复调用指纹计算函数),既降低查询效率,也可能引发一致性问题。以下是优化后的实现方案(以PostgreSQL+RDKit扩展为例):

优化后查询实现

from sqlalchemy import create_engine, text
import pandas as pd

# 数据库连接配置
engine = create_engine("postgresql://user:password@host:port/dbname")

# 配置参数
target_smiles = "CCO"  # 目标分子SMILES
similarity_threshold = 0.7  # 相似度阈值
table_name = "molecules"  # 存储分子的表名

# 使用CTE避免重复计算指纹
query = text(f"""
WITH molecule_fingerprints AS (
    SELECT 
        *, 
        morganbv_fp(smiles::qmol) AS mol_fp,
        morganbv_fp('{target_smiles}'::qmol) AS target_fp
    FROM {table_name}
)
SELECT 
    *, 
    mol_fp %% target_fp AS similarity
FROM molecule_fingerprints
WHERE mol_fp %% target_fp > {similarity_threshold}
ORDER BY similarity DESC
""")

# 执行查询并转换为表格
with engine.connect() as conn:
    result = conn.execute(query)
    result_df = pd.DataFrame(result.fetchall(), columns=result.keys())
    print(result_df)

关键优化说明

  • CTE复用计算结果:通过公共表表达式提前计算所有分子的指纹和目标分子的指纹,避免重复调用morganbv_fp函数,大幅提升查询效率。
  • 参数化查询(安全版):如果要避免SQL注入风险,建议使用参数绑定方式:
query = text("""
WITH molecule_fingerprints AS (
    SELECT 
        *, 
        morganbv_fp(smiles::qmol) AS mol_fp,
        morganbv_fp(:target_smiles::qmol) AS target_fp
    FROM :table_name
)
SELECT 
    *, 
    mol_fp %% target_fp AS similarity
FROM molecule_fingerprints
WHERE mol_fp %% target_fp > :threshold
ORDER BY similarity DESC
""")

result = conn.execute(query, {
    "target_smiles": target_smiles,
    "table_name": table_name,
    "threshold": similarity_threshold
})
  • 结果表格化:借助Pandas将查询结果转换为DataFrame,方便直接查看、导出或进一步分析。

注意事项

  • 确保数据库已安装RDKit扩展(支持morganbv_fp函数和qmol类型转换)。
  • 若数据量较大,建议提前预计算分子指纹并存储为单独字段,或为smiles字段建立索引,进一步提升查询速度。

内容的提问来源于stack exchange,提问作者Vincent_chem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:45:12