mcpField
H
hmdb-database

hmdb-database

github.com/jaechang-hitsデータ・データベース38468 回インストール1 週間前に更新
リポジトリ

hmdb-database について

ローカルに保存したHuman Metabolome DatabaseのXMLをPythonで検索するスキルです。メタボロミクス研究者向けに、代謝物の性質、生物学的背景、疾患との関連、スペクトル、他データベースの識別子を扱います。

主な機能

  1. 01HMDB IDまたは名称で検索
  2. 02化学的性質と分類の抽出
  3. 03経路と生物学的局在の取得
  4. 04疾患関連と濃度範囲の検索
  5. 05MS・NMRピークデータの取得
  6. 06データベース間のID対応付け

活用シーン

  1. 01質量分析データから代謝物候補を検索
  2. 02代謝物リストに関連する経路の調査
  3. 03疾患関連バイオマーカーの分析
  4. 04データベース横断ID対応表の作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jaechang-hits/sciagent-skills --skill hmdb-database

インストール後、Claude Code で/hmdb-databaseを入力して読み込まれたか確認します。

詳細

HMDB データベース — ローカル XML アクセス

概要

Python の ElementTree でローカルにダウンロードした XML を解析し、Human Metabolome Database(HMDB、22 万件以上の代謝物エントリ)を検索します。代謝物の検索、化学的特性、生物学的背景(経路、酵素、生体液)、疾患/バイオマーカーとの関連、代謝物の同定に使うスペクトルデータ、KEGG、PubChem、ChEBI、DrugBank へのデータベース間 ID マッピングに対応しています。

使用する場面

  • HMDB ID または名前から代謝物の情報(説明、化学クラス、細胞内局在)を調べる場合
  • メタボロミクス解析用に化学的特性(分子量、化学式、SMILES、InChI、logP、PSA)を取得する場合
  • 一連の代謝物について、経路との関連や酵素とのリンクを確認する場合
  • 代謝物の生体液/組織内での局在(血液、尿、CSF、唾液)を特定する場合
  • バイオマーカーの発見に向けて、疾患との関連や正常/異常濃度範囲を検索する場合
  • 代謝物の同定に使う NMR または MS のスペクトルピークリストを抽出する場合
  • HMDB ID を KEGG、PubChem、ChEBI、DrugBank、その他のデータベースに対応付ける場合
  • 医薬品に特化したデータ(相互作用、標的、薬理学)には、代わりに drugbank-database-access を使用してください
  • ダウンロードせずに化合物の特性をリアルタイムで検索する場合は、代わりに pubchem-compound-search を使用してください

前提条件

  • HMDB XML のダウンロード:https://hmdb.ca/downloads で登録し、hmdb_metabolites.xml.zip(展開後約 6 GB)をダウンロードします
  • Python パッケージ:lxml(より高速な XPath)または標準の xml.etree.ElementTree、pandas
  • パブリック REST API なし:HMDB にはプログラムから利用できる REST API がありません。アクセスはすべて、ローカル XML の解析またはウェブインターフェース経由です
  • R パッケージ(任意):CRAN の hmdbQuery は一部のクエリ用ラッパーを提供しますが、機能が限られており、古くなっています
  • レート制限:ローカル XML の解析には該当しません。ウェブインターフェースには公表されたレート制限はありませんが、スクレイピング用ではありません
pip install lxml pandas

クイックスタート

import xml.etree.ElementTree as ET

NS = {'hmdb': 'http://www.hmdb.ca'}

tree = ET.parse('hmdb_metabolites.xml')  # 60-120s for full XML
root = tree.getroot()

# Build lookup index (HMDB ID + lowercase name -> element)
metabolite_index = {}
for met in root.findall('hmdb:metabolite', NS):
    accession = met.find('hmdb:accession', NS)
    name = met.find('hmdb:name', NS)
    if accession is not None and accession.text:
        metabolite_index[accession.text] = met
    if name is not None and name.text:
        metabolite_index[name.text.lower()] = met

def find_metabolite(query):
    """Find metabolite by HMDB ID or name (case-insensitive)."""
    return metabolite_index.get(query) or metabolite_index.get(query.lower())

met = find_metabolite('HMDB0000122')  # Glucose
name = met.find('hmdb:name', NS).text
formula = met.find('hmdb:chemical_formula', NS).text
print(f"{name}: {formula}")
# Glucose: C6H12O6

コア API

1. XML のセットアップと代謝物の検索
import xml.etree.ElementTree as ET

NS = {'hmdb': 'http://www.hmdb.ca'}
tree = ET.parse('hmdb_metabolites.xml')
root = tree.getroot()
print(f"Total metabolite entries: {len(root.findall('hmdb:metabolite', NS))}")
# Total metabolite entries: ~220000+

メモリに制約のある環境では、iterparse を使用します。

met_names = {}
for event, elem in ET.iterparse('hmdb_metabolites.xml', events=('end',)):
    if elem.tag == '{http://www.hmdb.ca}metabolite':
        acc = elem.find('{http://www.hmdb.ca}accession')
        name = elem.find('{http://www.hmdb.ca}name')
        if acc is not None and name is not None and acc.text and name.text:
            met_names[acc.text] = name.text
        elem.clear()
print(f"Parsed {len(met_names)} metabolites via iterparse")
2. 化学的特性
def get_chemical_properties(met_element):
    """Extract chemical properties from a metabolite entry."""
    def txt(path):
        el = met_element.find(path, NS)
        return el.text if el is not None and el.text else None
    # Fields: accession, name, chemical_formula, average_molecular_weight,
    # monisotopic_molecular_weight, smiles, inchi, inchikey, state, iupac_name
    return {tag: txt(f'hmdb:{tag}') for tag in [
        'accession', 'name', 'chemical_formula', 'average_molecular_weight',
        'monisotopic_molecular_weight', 'smiles', 'inchi', 'inchikey', 'state']}

props = get_chemical_properties(find_metabolite('HMDB0000158'))  # L-Tyrosine
print(f"{props['name']}: MW={props['average_molecular_weight']}, SMILES={props['smiles']}")
# Extract taxonomy / chemical classification (ClassyFire ontology)
def get_classification(met_element):
    tax = met_element.find('hmdb:taxonomy', NS)
    if tax is None:
        return {}
    def txt(tag):
        el = tax.find(f'hmdb:{tag}', NS)
        return el.text if el is not None and el.text else None
    return {'kingdom': txt('kingdom'), 'super_class': txt('super_class'),
            'class': txt('class'), 'sub_class': txt('sub_class'),
            'direct_parent': txt('direct_parent')}

print(get_classification(find_metabolite('HMDB0000122')))
# {'kingdom': 'Organic compounds', 'super_class': 'Organooxygen compounds', ...}
3. 生物学的背景
def get_pathways(met_element):
    """Extract metabolic pathway associations."""
    pathways = []
    for pw in met_element.findall('hmdb:pathways/hmdb:pathway', NS):
        name = pw.find('hmdb:name', NS)
        smpdb_id = pw.find('hmdb:smpdb_id', NS)
        kegg_id = pw.find('hmdb:kegg_map_id', NS)
        pathways.append({
            'name': name.text if name is not None else None,
            'smpdb_id': smpdb_id.text if smpdb_id is not None else None,
            'kegg_map_id': kegg_id.text if kegg_id is not None else None,
        })
    return pathways

for pw in get_pathways(find_metabolite('HMDB0000122'))[:5]:
    print(f"  {pw['smpdb_id']}: {pw['name']}")
def get_biolocations(met_element):
    """Extract biofluid, tissue, and cellular locations."""
    bp = 'hmdb:biological_properties/hmdb:'
    def texts(path):
        return [el.text for el in met_element.findall(path, NS) if el.text]
    return {'biofluids': texts(f'{bp}biospecimen_locations/hmdb:biospecimen'),
            'tissues': texts(f'{bp}tissue_locations/hmdb:tissue'),
            'cellular': texts(f'{bp}cellular_locations/hmdb:cellular')}

locs = get_biolocations(find_metabolite('HMDB0000122'))
print(f"Glucose biofluids: {locs['biofluids']}")
def get_enzymes(met_element):
    """Extract associated enzymes/proteins with UniProt IDs."""
    return [{'name': (p.find('hmdb:name', NS).text
                      if p.find('hmdb:name', NS) is not None else None),
             'uniprot_id': (p.find('hmdb:uniprot_id', NS).text
                            if p.find('hmdb:uniprot_id', NS) is not None else None),
             'gene_name': (p.find('hmdb:gene_name', NS).text
                           if p.find('hmdb:gene_name', NS) is not None else None)}
            for p in met_element.findall('hmdb:protein_associations/hmdb:protein', NS)]

enz = get_enzymes(find_metabolite('HMDB0000122'))
print(f"Glucose-associated proteins: {len(enz)}")
for e in enz[:3]:
    print(f"  {e['gene_name']} ({e['uniprot_id']}): {e['name']}")
4. 疾患とバイオマーカーの検索
def get_diseases(met_element):
    """Extract disease associations with OMIM IDs and PubMed references."""
    diseases = []
    for d in met_element.findall('hmdb:diseases/hmdb:disease', NS):
        name = d.find('hmdb:name', NS)
        omim = d.find('hmdb:omim_id', NS)
        pmids = [r.find('hmdb:pubmed_id', NS).text
                 for r in d.findall('hmdb:references/hmdb:reference', NS)
                 if r.find('hmdb:pubmed_id', NS) is not None and r.find('hmdb:pubmed_id', NS).text]
        diseases.append({'name': name.text if name is not None else None,
                         'omim_id': omim.text if omim is not None else None,
                         'pubmed_ids': pmids})
    return diseases

diseases = get_diseases(find_metabolite('HMDB0000122'))
print(f"Glucose disease associations: {len(diseases)}")
for d in diseases[:3]:
    print(f"  {d['name']} (OMIM: {d['omim_id']})")
def get_concentrations(met_element, biospecimen='Blood'):
    """Extract normal/abnormal concentration data filtered by biospecimen."""
    result = {'normal': [], 'abnormal': []}
    for ctype, key in [('normal_concentrations', 'normal'),
                       ('abnormal_concentrations', 'abnormal')]:
        for c in met_element.findall(f'hmdb:{ctype}/hmdb:concentration', NS):
            bio = c.find('hmdb:biospecimen', NS)
            if bio is None or bio.text != biospecimen:
                continue
            def txt(tag):
                el = c.find(f'hmdb:{tag}', NS)
                return el.text if el is not None else None
            result[key].append({'value': txt('concentration_value'),
                                'units': txt('concentration_units'),
                                'condition': txt('subject_condition')})
    return result

conc = get_concentrations(find_metabolite('HMDB0000122'), 'Blood')
print(f"Glucose blood: {len(conc['normal'])} normal, {len(conc['abnormal'])} abnormal")
5. スペクトルデータ
def get_ms_spectra(met_element):
    """Extract MS/MS spectral peak lists (m/z + intensity)."""
    spectra = []
    for spec in met_element.findall('hmdb:spectra/hmdb:spectrum', NS):
        stype = spec.find('hmdb:type', NS)
        if stype is None or 'MS' not in (stype.text or ''):
            continue
        peaks = [{'mz': float(p.find('hmdb:mass_charge', NS).text),
                  'intensity': float(p.find('hmdb:intensity', NS).text or 0)}
                 for p in spec.findall('hmdb:ms_ms_peaks/hmdb:ms_ms_peak', NS)
                 if p.find('hmdb:mass_charge', NS) is not None
                 and p.find('hmdb:mass_charge', NS).text]
        spectra.append({'type': stype.text, 'num_peaks': len(peaks), 'peaks': peaks})
    return spectra

spectra = get_ms_spectra(find_metabolite('HMDB0000122'))
print(f"Glucose MS spectra: {len(spectra)}")
def get_nmr_spectra(met_element):
    """Extract NMR spectral peak lists (1H, 13C). Same pattern as MS above."""
    spectra = []
    for spec in met_element.findall('hmdb:spectra/hmdb:spectrum', NS):
        stype = spec.find('hmdb:type', NS)
        if stype is None or 'NMR' not in (stype.text or ''):
            continue
        nucleus = spec.find('hmdb:nucleus', NS)
        shifts = [float(p.find('hmdb:chemical_shift', NS).text)
                  for p in spec.findall('hmdb:nmr_one_d_peaks/hmdb:nmr_one_d_peak', NS)
                  if p.find('hmdb:chemical_shift', NS) is not None
                  and p.find('hmdb:chemical_shift', NS).text]
        spectra.append({'type': stype.text,
                        'nucleus': nucleus.text if nucleus is not None else None,
                        'num_peaks': len(shifts), 'chemical_shifts': shifts})
    return spectra

nmr = get_nmr_spectra(find_metabolite('HMDB0000122'))
print(f"Glucose NMR spectra: {len(nmr)}")
6. データベース間マッピング
def get_external_ids(met_element):
    """Extract cross-database identifiers (KEGG, PubChem, ChEBI, DrugBank, CAS, etc.)."""
    fields = {'kegg_id': 'KEGG', 'pubchem_compound_id': 'PubChem', 'chebi_id': 'ChEBI',
              'drugbank_id': 'DrugBank', 'chemspider_id': 'ChemSpider',
              'cas_registry_number': 'CAS', 'biocyc_id': 'BioCyc', 'pdb_id': 'PDB',
              'foodb_id': 'FooDB', 'metlin_id': 'METLIN'}
    ids = {}
    for tag, label in fields.items():
        el = met_element.find(f'hmdb:{tag}', NS)
        if el is not None and el.text:
            ids[label] = el.text
    return ids

ids = get_external_ids(find_metabolite('HMDB0000122'))
print(f"Glucose cross-refs: {ids}")
# {'KEGG': 'C00031', 'PubChem': '5793', 'ChEBI': '17234', ...}
# Build cross-reference table for a metabolite list
import pandas as pd

queries = ['HMDB0000122', 'HMDB0000158', 'HMDB0000167', 'HMDB0000148']
rows = []
for q in queries:
    m = find_metabolite(q)
    if m is None: continue
    ids = get_external_ids(m)
    rows.append({'name': m.find('hmdb:name', NS).text, 'hmdb_id': q,
                 'kegg': ids.get('KEGG'), 'pubchem': ids.get('PubChem'),
                 'chebi': ids.get('ChEBI')})
print(pd.DataFrame(rows).to_string(index=False))

主な概念

HMDB XML エントリの構造
セクションXPath内容
ID 情報hmdb:accession、hmdb:name、hmdb:iupac_name主な識別子
化学情報hmdb:chemical_formula、hmdb:smiles、hmdb:inchi構造記述子
特性hmdb:average_molecular_weight、hmdb:state物理的特性
分類hmdb:taxonomy/hmdb:kingdom、class など化学分類
生物学的情報hmdb:biological_properties生体液、組織、細胞内局在
経路hmdb:pathways/hmdb:pathwaySMPDB および KEGG の経路リンク
酵素hmdb:protein_associations/hmdb:protein関連するタンパク質/酵素
疾患hmdb:diseases/hmdb:disease疾患との関連および OMIM ID
濃度hmdb:normal_concentrations、hmdb:abnormal_concentrationsバイオマーカーの基準範囲
スペクトルhmdb:spectra/hmdb:spectrumNMR、MS/MS ピークリスト
外部 IDhmdb:kegg_id、hmdb:pubchem_compound_id などデータベース間の識別子
オントロジーhmdb:ontology生理学的役割/排出・分布/プロセス上の役割
データフィールドの充足状況

すべてのエントリに、すべてのフィールドが入力されているわけではありません。充足状況は代謝物のクラスによって異なります。

フィールドカテゴリおおよその充足率備考
アクセッション、名称、分子式~100%常に存在します
SMILES、InChI、MW~90%一部の脂質や複雑な代謝物では欠落しています
分類・分類体系~85%ClassyFire による化学オントロジー
生体液中の所在~60%一般的なヒト代謝物で最も充実しています
経路~40%厳選された SMPDB + KEGG リンク
タンパク質との関連~35%酵素と代謝物の関係
疾患との関連~25%主にバイオマーカー代謝物を対象とします
正常濃度~20%臨床代謝物の基準範囲
MS/MS スペクトル~15%実験的なスペクトルライブラリ
NMR スペクトル~10%1H および 13C の化学シフトデータ
ファイル形式の比較
形式ファイルサイズ最適な用途
Full XMLhmdb_metabolites.xml~6 GB完全なデータへのアクセス(すべてのフィールド)
SDFstructures.sdf~200 MB化学構造 + 基本的な特性
CSV各種エクスポート~50-500 MB表形式のデータ(特性、濃度)
FASTAhmdb_proteins.fasta~50 MBタンパク質配列の検索

一般的なワークフロー

ワークフロー 1:質量分析による代謝物の同定

目的:分子量を使って、観測された m/z 値を候補代謝物に照合します。Quick Start で定義した root と NS を使用します。

import pandas as pd

observed_mz = 180.063  # [M+H]+ for glucose
adduct_mass = 1.00728  # H+ adduct
target_mw = observed_mz - adduct_mass
tolerance_da = 0.01

candidates = []
for met in root.findall('hmdb:metabolite', NS):
    mw_el = met.find('hmdb:monisotopic_molecular_weight', NS)
    if mw_el is None or not mw_el.text:
        continue
    mw = float(mw_el.text)
    if abs(mw - target_mw) <= tolerance_da:
        candidates.append({
            'hmdb_id': met.find('hmdb:accession', NS).text,
            'name': met.find('hmdb:name', NS).text,
            'mw': mw, 'delta_da': abs(mw - target_mw),
            'formula': (met.find('hmdb:chemical_formula', NS).text
                        if met.find('hmdb:chemical_formula', NS) is not None else None),
        })

df = pd.DataFrame(candidates).sort_values('delta_da')
print(f"Candidates within {tolerance_da} Da of {target_mw:.3f}: {len(df)}")
print(df.head(10).to_string(index=False))
ワークフロー 2:疾患のバイオマーカー探索

目的:疾患に関連するすべての代謝物と、その濃度変化を見つけます。Quick Start で定義した root と NS を使用します。

import pandas as pd

disease_query = 'diabetes'
biomarkers = []
for met in root.findall('hmdb:metabolite', NS):
    for d in met.findall('hmdb:diseases/hmdb:disease', NS):
        dname = d.find('hmdb:name', NS)
        if dname is None or not dname.text:
            continue
        if disease_query.lower() not in dname.text.lower():
            continue
        abnormal = [c for c in met.findall(
            'hmdb:abnormal_concentrations/hmdb:concentration', NS)
            if c.find('hmdb:subject_condition', NS) is not None
            and disease_query.lower() in
            (c.find('hmdb:subject_condition', NS).text or '').lower()]
        biomarkers.append({
            'hmdb_id': met.find('hmdb:accession', NS).text,
            'metabolite': met.find('hmdb:name', NS).text,
            'disease': dname.text,
            'abnormal_measurements': len(abnormal),
        })

df = pd.DataFrame(biomarkers).drop_duplicates(['hmdb_id', 'disease'])
print(f"Metabolites linked to '{disease_query}': {len(df)}")
print(df.sort_values('abnormal_measurements', ascending=False).head(15).to_string(index=False))
ワークフロー 3:代謝物リストからの経路エンリッチメント解析

目的:同定済み代謝物のリストから、過剰に存在する経路を見つけます。Quick Start で定義した metabolite_index を使用します。

from collections import Counter
import pandas as pd

hit_ids = ['HMDB0000122', 'HMDB0000158', 'HMDB0000167',
           'HMDB0000148', 'HMDB0000064', 'HMDB0000161']

hit_pathways = Counter()
for hid in hit_ids:
    met = metabolite_index.get(hid)
    if met is None:
        continue
    for pw in met.findall('hmdb:pathways/hmdb:pathway', NS):
        pw_name = pw.find('hmdb:name', NS)
        if pw_name is not None and pw_name.text:
            hit_pathways[pw_name.text] += 1

enriched = [(pw, count) for pw, count in hit_pathways.most_common() if count >= 2]
df = pd.DataFrame(enriched, columns=['Pathway', 'Hit_Count'])
print(f"Pathways with 2+ hits from {len(hit_ids)} metabolites:")
print(df.to_string(index=False))

主要なパラメーター

パラメーター関数/エンドポイントデフォルト説明
NS(名前空間の辞書)すべての XPath クエリ{'hmdb': 'http://www.hmdb.ca'}すべての find/findall 呼び出しに必要です
tolerance_daMW 照合0.01代謝物 ID の質量許容差(ダルトン)
biospecimenget_concentrations()'Blood'フィルター:Blood、Urine、Cerebrospinal Fluid (CSF)、Saliva など
eventsET.iterparse()('end',)解析イベント。閉じタグで実行するには ('end',) を使用します
付加体の質量MS による同定変動します1.00728 [M+H]+、22.9892 [M+Na]+、-1.00728 [M-H]-
target_typeスペクトルクエリ'MS' または 'NMR'型文字列でスペクトルをフィルターします

ベストプラクティス

  1. 起動時にメモリー内インデックスを構築します:一度だけ解析し(60~120 秒)、HMDB ID と小文字の名称で辞書を構築します。ループ内で再解析しないでください
  2. 名前空間の辞書を必ず渡します:すべての find()/findall() に NS = {'hmdb': 'http://www.hmdb.ca'} が必要です。省略すると、結果は空になります
  3. メモリーに制約がある場合は iterparse を使用します:Full XML には約 8~12 GB の RAM が必要です。iterparse で段階的に処理するには elem.clear() を使用します
  4. None と空のテキストに備えます:省略可能なフィールドの多くは存在しません。アクセスする前に、必ず el is not None and el.text を確認してください
  5. MS 照合にはモノアイソトピック質量を使用します:質量分析には monisotopic_molecular_weight が適切です。それ以外の計算には average_molecular_weight を使用します
  6. 大規模な検索では、化学クラスで事前に絞り込みます:220K 件を超えるすべてのエントリを反復処理する前に、分類・分類体系を使って検索範囲を絞り込みます

よく使うレシピ

レシピ:すべての代謝物の特性を CSV にエクスポートする

使用する場面:主要な特性を含む、すべての代謝物のフラットテーブルを作成します。

import pandas as pd
records = []
for met in root.findall('hmdb:metabolite', NS):
    def txt(p):
        el = met.find(p, NS)
        return el.text if el is not None and el.text else None
    records.append({'hmdb_id': txt('hmdb:accession'), 'name': txt('hmdb:name'),
                    'formula': txt('hmdb:chemical_formula'),
                    'avg_mw': txt('hmdb:average_molecular_weight'),
                    'smiles': txt('hmdb:smiles')})
pd.DataFrame(records).to_csv('hmdb_properties.csv', index=False)
print(f"Exported {len(records)} metabolites")
レシピ:生体液から代謝物を検索する

使用する場面:特定の生体液で検出されたすべての代謝物を取得します(例:臨床スクリーニングのために尿中の代謝物を取得する)。

biofluid = 'Urine'
urine_mets = []
for met in root.findall('hmdb:metabolite', NS):
    for bf in met.findall(
            'hmdb:biological_properties/hmdb:biospecimen_locations/hmdb:biospecimen', NS):
        if bf.text and bf.text == biofluid:
            urine_mets.append({
                'hmdb_id': met.find('hmdb:accession', NS).text,
                'name': met.find('hmdb:name', NS).text,
            })
            break
print(f"Metabolites in {biofluid}: {len(urine_mets)}")
レシピ:化学クラスの分布

使用する場面:ヒットリストまたはデータベース全体について、代謝物の化学クラスを要約します。

from collections import Counter
class_counts = Counter()
for met in root.findall('hmdb:metabolite', NS):
    tax = met.find('hmdb:taxonomy', NS)
    if tax is not None:
        sc = tax.find('hmdb:super_class', NS)
        if sc is not None and sc.text:
            class_counts[sc.text] += 1
print(dict(class_counts.most_common(10)))

トラブルシューティング

問題原因解決策
find() が既知の要素に対して None を返すXML 名前空間が指定されていない常に NS = {'hmdb': 'http://www.hmdb.ca'} を渡します
XML 全体の解析時に MemoryError が発生するメモリに約8~12 GB必要ET.iterparse() と elem.clear() を使用します
起動が遅い(120秒超)6 GBのXMLを解析している解析は一度だけ行い、インデックス辞書を作成します。再解析は避けます
名前で代謝物が見つからない大文字と小文字の区別、または同義語小文字に正規化し、HMDB IDを直接試します
代謝物のスペクトルが空すべてのエントリにスペクトルがあるわけではありません(カバー率は約10~15%)カバー率の表を確認し、より多くのスペクトルが必要な場合はMETLINまたはMassBankを使用します
濃度データがない十分に研究された臨床代謝物に限られます(約20%)MetaboAnalystまたは文献と照合します
同じ化合物に重複エントリがあるセカンダリアクセッション(HMDB00XXXXXとHMDB0000XXXX)secondary_accessions ではなく、accession(プライマリ)を使用します
ET.iterparse でデータが欠落するelem.clear() が早すぎる要素から必要なフィールドをすべて抽出した後にのみ、クリアします

同梱リソース

自己完結型のエントリです。元の参照ファイル hmdb_data_fields.md(268行、XML要素名と説明を含むフィールドカタログ)は、上記の「主要な概念」の「HMDB XML エントリ構造」表と「データフィールドの網羅性」表に統合されています。フィールドカタログの各要素のXMLタグ名は、コアAPIのコードブロックで示されています。元の内容から省略したもの:ウェブインターフェースの説明(プログラムからの利用には該当しないため)。

関連スキル

  • drugbank-database-access -- 薬物固有のデータ(相互作用、標的、薬理学)。同様のローカルXML解析パターンを使用します
  • pubchem-compound-search -- ダウンロードせずに化合物の特性をリアルタイムで検索します。PubChemPy REST APIを使用します
  • kegg-database -- HMDBの経路検索結果との相互参照に使えるREST APIを備えた経路・化合物データベース
  • matchms-spectral-matching -- 参照ライブラリに対するスペクトル類似性マッチング。HMDBのスペクトルデータを補完します
  • pyopenms-mass-spectrometry -- LC-MS/MSの全処理パイプライン。代謝物の同定段階でHMDBを使用します

参考資料

コメント