hmdb-database について
ローカルに保存したHuman Metabolome DatabaseのXMLをPythonで検索するスキルです。メタボロミクス研究者向けに、代謝物の性質、生物学的背景、疾患との関連、スペクトル、他データベースの識別子を扱います。
主な機能
- 01HMDB IDまたは名称で検索
- 02化学的性質と分類の抽出
- 03経路と生物学的局在の取得
- 04疾患関連と濃度範囲の検索
- 05MS・NMRピークデータの取得
- 06データベース間のID対応付け
活用シーン
- 01質量分析データから代謝物候補を検索
- 02代謝物リストに関連する経路の調査
- 03疾患関連バイオマーカーの分析
- 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:pathway | SMPDB および KEGG の経路リンク |
| 酵素 | hmdb:protein_associations/hmdb:protein | 関連するタンパク質/酵素 |
| 疾患 | hmdb:diseases/hmdb:disease | 疾患との関連および OMIM ID |
| 濃度 | hmdb:normal_concentrations、hmdb:abnormal_concentrations | バイオマーカーの基準範囲 |
| スペクトル | hmdb:spectra/hmdb:spectrum | NMR、MS/MS ピークリスト |
| 外部 ID | hmdb: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 XML | hmdb_metabolites.xml | ~6 GB | 完全なデータへのアクセス(すべてのフィールド) |
| SDF | structures.sdf | ~200 MB | 化学構造 + 基本的な特性 |
| CSV | 各種エクスポート | ~50-500 MB | 表形式のデータ(特性、濃度) |
| FASTA | hmdb_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_da | MW 照合 | 0.01 | 代謝物 ID の質量許容差(ダルトン) |
biospecimen | get_concentrations() | 'Blood' | フィルター:Blood、Urine、Cerebrospinal Fluid (CSF)、Saliva など |
events | ET.iterparse() | ('end',) | 解析イベント。閉じタグで実行するには ('end',) を使用します |
| 付加体の質量 | MS による同定 | 変動します | 1.00728 [M+H]+、22.9892 [M+Na]+、-1.00728 [M-H]- |
target_type | スペクトルクエリ | 'MS' または 'NMR' | 型文字列でスペクトルをフィルターします |
ベストプラクティス
- 起動時にメモリー内インデックスを構築します:一度だけ解析し(60~120 秒)、HMDB ID と小文字の名称で辞書を構築します。ループ内で再解析しないでください
- 名前空間の辞書を必ず渡します:すべての
find()/findall()にNS = {'hmdb': 'http://www.hmdb.ca'}が必要です。省略すると、結果は空になります - メモリーに制約がある場合は iterparse を使用します:Full XML には約 8~12 GB の RAM が必要です。
iterparseで段階的に処理するにはelem.clear()を使用します - None と空のテキストに備えます:省略可能なフィールドの多くは存在しません。アクセスする前に、必ず
el is not None and el.textを確認してください - MS 照合にはモノアイソトピック質量を使用します:質量分析には
monisotopic_molecular_weightが適切です。それ以外の計算にはaverage_molecular_weightを使用します - 大規模な検索では、化学クラスで事前に絞り込みます: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を使用します
参考資料
- HMDBのウェブサイトとダウンロード:https://hmdb.ca/
- Wishart DS et al. (2022). HMDB 5.0: the Human Metabolome Database for 2022. Nucleic Acids Res. 50(D1):D801-D816. https://doi.org/10.1093/nar/gkab1062
- HMDBのデータダウンロードページ:https://hmdb.ca/downloads
- MetaboAnalyst(補完的なツール):https://www.metaboanalyst.ca/