gene-database について
gene-database は、E-utilities と NCBI Datasets API で NCBI Gene を検索するスキルです。研究者やバイオインフォマティクスのワークフロー向けに、遺伝子識別子の解決や、整理済みの注釈、アクセッション、GO 用語、オルソログの取得を支援します。
主な機能
- 01シンボル、名称、機能による検索
- 02シンボルから NCBI Gene ID への対応付け
- 03概要と完全な遺伝子レコードの取得
- 04RefSeq アクセッションと GO 注釈の抽出
- 05種をまたぐオルソログの検索
活用シーン
- 01遺伝子エイリアスを公式シンボルに解決
- 02遺伝子注釈テーブルの作成
- 03遺伝子の RefSeq アクセッション取得
- 04種間オルソログの検索
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jaechang-hits/ sciagent-skills --skill gene-databaseインストール後、Claude Code で/gene-databaseを入力して読み込まれたか確認します。
詳細
NCBI Gene データベース
概要
NCBI Gene は、数十万の分類群にわたる 100 万を超える遺伝子を網羅した、遺伝子中心の情報を提供する信頼性の高いキュレーション済みデータベースです。各遺伝子レコードには、公式シンボル、別名、正式名称、機能の概要、ゲノム上の座標(GRCh38/GRCh37)、RefSeq アクセッション、GO アノテーション、相互作用する遺伝子、および関連データベースへのリンクが含まれます。E-utilities REST API を介して無料でアクセスできます(API キーは不要ですが、使用が推奨されています)。
使用する場面
- 遺伝子の別名や同義語を、現在の公式 HGNC/NCBI シンボルに照合する場合
- 下流の API 呼び出し(dbSNP、ClinVar、GEO など)で使う遺伝子シンボルの NCBI Gene ID(整数)を取得する場合
- キュレーション済みの遺伝子の概要や機能の説明をプログラムから取得する場合
- 遺伝子に関連付けられた RefSeq mRNA(NM_)およびタンパク質(NP_)アクセッションを取得する場合
- GO 機能アノテーション(生物学的プロセス、分子機能、細胞構成要素)を照会する場合
- NCBI Datasets v2 のオルソログエンドポイントを介して種間のオルソログを検索する場合(従来の E-utilities
gene_gene_homologは、2019 年の HomoloGene の廃止に伴い提供終了) - 条件ごとの発現プロファイルには
geo-databaseを、バリアントのアノテーションにはclinvar-databaseまたはensembl-databaseを使用してください
前提条件
- Python パッケージ:
requests、xml.etree.ElementTree(標準ライブラリ)、pandas(任意) - データ要件:遺伝子シンボル、NCBI Gene ID、または tax ID
- 環境:インターネット接続。NCBI のメールアドレスが必要です(
emailパラメーターを設定) - レート制限:認証なしの場合は 3 req/s、無料の NCBI API キーを使用する場合は 10 req/s
pip install requests pandas
クイックスタート
import requests
EMAIL = "[email protected]"
BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
def gene_search(query, retmax=5):
r = requests.get(f"{BASE}/esearch.fcgi",
params={"db": "gene", "term": query,
"retmax": retmax, "retmode": "json", "email": EMAIL})
r.raise_for_status()
return r.json()["esearchresult"]["idlist"]
# Find human BRCA1 gene ID
ids = gene_search("BRCA1[sym] AND Homo sapiens[orgn]")
print(f"Gene IDs for BRCA1: {ids}") # → ['672']
コア API
クエリ 1:シンボル、名称、または機能による検索
フィールドタグを指定した ESearch を使用して、精度の高いクエリを実行します。
import requests
EMAIL = "[email protected]"
BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
# Exact symbol match for human gene
r = requests.get(f"{BASE}/esearch.fcgi",
params={"db": "gene", "email": EMAIL, "retmode": "json",
"term": "TP53[sym] AND Homo sapiens[orgn] AND alive[prop]"})
ids = r.json()["esearchresult"]["idlist"]
print(f"TP53 Gene ID: {ids}") # → ['7157']
# Search by function keyword
r = requests.get(f"{BASE}/esearch.fcgi",
params={"db": "gene", "email": EMAIL, "retmode": "json",
"term": "CRISPR[title] AND Homo sapiens[orgn]", "retmax": 5})
ids = r.json()["esearchresult"]["idlist"]
print(f"CRISPR-related gene IDs: {ids}")
クエリ 2:遺伝子の概要を取得(JSON/ESummary)
遺伝子 ID のリストについて、主要なメタデータフィールドを取得します。
import requests
EMAIL = "[email protected]"
BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
def esummary_gene(gene_ids):
r = requests.post(f"{BASE}/esummary.fcgi",
data={"db": "gene", "id": ",".join(gene_ids),
"retmode": "json", "email": EMAIL})
r.raise_for_status()
return r.json()["result"]
result = esummary_gene(["672", "675", "7157"]) # BRCA1, BRCA2, TP53
for uid in result.get("uids", []):
g = result[uid]
print(f"\n{g.get('name')} (ID {uid})")
print(f" Official symbol : {g.get('nomenclaturesymbol', g.get('name'))}")
print(f" Chr location : {g.get('maplocation')}")
print(f" Summary (first 100): {g.get('summary', '')[:100]}...")
print(f" Aliases: {g.get('otheraliases', 'none')}")
クエリ 3:遺伝子レコード全体を取得(XML)
RefSeq アクセッション、GO 用語、相互作用データを取得するため、遺伝子レコード全体を XML で取得します。
import requests
import xml.etree.ElementTree as ET
EMAIL = "[email protected]"
BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
def efetch_gene_xml(gene_id):
r = requests.get(f"{BASE}/efetch.fcgi",
params={"db": "gene", "id": gene_id,
"rettype": "gene_table", "retmode": "text", "email": EMAIL})
r.raise_for_status()
return r.text
# Get gene table (tab-delimited overview)
table = efetch_gene_xml("672")
print(table[:500])
# XML for RefSeq accession extraction
r = requests.get(f"{BASE}/efetch.fcgi",
params={"db": "gene", "id": "672",
"rettype": "xml", "retmode": "xml", "email": EMAIL})
root = ET.fromstring(r.text)
# Extract RefSeq mRNA accessions
for ref in root.iter("Gene-commentary"):
acc = ref.find("Gene-commentary_accession")
ver = ref.find("Gene-commentary_version")
typ = ref.find("Gene-commentary_type")
if acc is not None and acc.text and acc.text.startswith("NM_"):
print(f"RefSeq mRNA: {acc.text}.{ver.text if ver is not None else ''}")
クエリ 4:シンボルから ID への一括マッピング
遺伝子シンボルのリストを NCBI Gene ID に効率よくマッピングします。
import requests, time
EMAIL = "[email protected]"
BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
def symbols_to_ids(symbols, organism="Homo sapiens"):
"""Map gene symbols to NCBI Gene IDs. Returns dict {symbol: gene_id}."""
mapping = {}
for sym in symbols:
r = requests.get(f"{BASE}/esearch.fcgi",
params={"db": "gene", "email": EMAIL, "retmode": "json",
"term": f"{sym}[sym] AND {organism}[orgn] AND alive[prop]"})
ids = r.json()["esearchresult"]["idlist"]
mapping[sym] = ids[0] if ids else None
time.sleep(0.1)
return mapping
genes = ["EGFR", "KRAS", "BRAF", "PIK3CA", "PTEN"]
id_map = symbols_to_ids(genes)
for sym, gid in id_map.items():
print(f"{sym:10s} → Gene ID {gid}")
クエリ 5:GO アノテーションの取得
遺伝子 XML レコードから GO 用語を解析します。
import requests
import xml.etree.ElementTree as ET
EMAIL = "[email protected]"
BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
r = requests.get(f"{BASE}/efetch.fcgi",
params={"db": "gene", "id": "7157",
"rettype": "xml", "retmode": "xml", "email": EMAIL})
root = ET.fromstring(r.text)
# Extract GO annotations
go_terms = []
for ref in root.iter("Gene-commentary"):
heading = ref.find("Gene-commentary_heading")
label = ref.find("Gene-commentary_label")
if heading is not None and "Gene Ontology" in heading.text:
if label is not None:
go_terms.append(label.text)
print(f"TP53 GO terms ({len(go_terms)} found):")
for term in go_terms[:10]:
print(f" {term}")
クエリ 6:種間のオルソログ(NCBI Datasets v2)
種間のオルソログを検索します。注:従来の E-utilities リンク gene_gene_homolog は、2019 年の HomoloGene の廃止に伴い提供終了しました。現在は、専用のオルソログエンドポイントを公開する NCBI Datasets v2 REST API を使用します。
import requests, time
DATASETS_BASE = "https://api.ncbi.nlm.nih.gov/datasets/v2"
def get_orthologs(gene_id, taxon_filter=None):
"""Return ortholog Gene reports for a given NCBI Gene ID.
taxon_filter: optional tax_id (int) or list of tax_ids to narrow species."""
params = {}
if taxon_filter is not None:
# tax_ids: human=9606, mouse=10090, rat=10116, zebrafish=7955, fly=7227
ids = taxon_filter if isinstance(taxon_filter, (list, tuple)) else [taxon_filter]
params["taxon_filter"] = [str(t) for t in ids]
r = requests.get(f"{DATASETS_BASE}/gene/id/{gene_id}/orthologs",
params=params, timeout=30)
r.raise_for_status()
return r.json().get("reports", [])
# Mouse ortholog of human TP53 (Gene ID 7157)
reports = get_orthologs("7157", taxon_filter=10090)
for rep in reports[:5]:
g = rep.get("gene", {})
print(f" {g.get('symbol'):8s} (tax {g.get('tax_id')}, gene_id {g.get('gene_id')}): "
f"{g.get('description', '')[:60]}")
# Expect: Trp53 (tax 10090, gene_id 22059): transformation related protein 53
time.sleep(0.34)
# All orthologs (every species in the orthology group)
all_orthologs = get_orthologs("7157")
print(f"\nTotal TP53 orthologs across species: {len(all_orthologs)}")
主要な概念
NCBI Gene ID と HGNC ID、Ensembl ID の違い
NCBI Gene ID は、生物種ごとの各遺伝子に割り当てられる整数です(例:ヒトの TP53 = 7157)。HGNC ID(例:HGNC:11998)や Ensembl ID(ENSG00000141510)とは異なります。下流の NCBI データベース(ClinVar、dbSNP、GEO など)の多くは、内部で NCBI Gene ID を使用します。
alive[prop] フィルター
廃止された遺伝子の NCBI Gene レコードには status=discontinued が設定されています。廃止済みエントリーを除外し、古いデータを取得しないよう、シンボルクエリには必ず AND alive[prop] を追加してください。
一般的なワークフロー
ワークフロー 1:遺伝子アノテーションテーブルの作成
目的:遺伝子シンボルのリストを対象に、Gene ID、正式名称、染色体上の位置、説明を取得します。
import requests, time, pandas as pd
EMAIL = "[email protected]"
BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
def search_gene(sym, organism="Homo sapiens"):
r = requests.get(f"{BASE}/esearch.fcgi",
params={"db": "gene", "email": EMAIL, "retmode": "json",
"term": f"{sym}[sym] AND {organism}[orgn] AND alive[prop]"})
ids = r.json()["esearchresult"]["idlist"]
return ids[0] if ids else None
def batch_summary(gene_ids):
r = requests.post(f"{BASE}/esummary.fcgi",
data={"db": "gene", "id": ",".join(gene_ids),
"retmode": "json", "email": EMAIL})
return r.json()["result"]
symbols = ["BRCA1", "BRCA2", "TP53", "EGFR", "MYC", "KRAS", "PTEN"]
# Step 1: Symbol → Gene ID
id_map = {}
for sym in symbols:
gid = search_gene(sym)
id_map[sym] = gid
time.sleep(0.12)
# Step 2: Batch summary
valid_ids = [v for v in id_map.values() if v]
result = batch_summary(valid_ids)
rows = []
sym_to_id = {v: k for k, v in id_map.items() if v}
for uid in result.get("uids", []):
g = result[uid]
rows.append({
"symbol": sym_to_id.get(uid, g.get("name")),
"gene_id": uid,
"full_name": g.get("description"),
"chr_location": g.get("maplocation"),
"summary": g.get("summary", "")[:200],
})
df = pd.DataFrame(rows)
df.to_csv("gene_annotations.csv", index=False)
print(df[["symbol", "gene_id", "full_name", "chr_location"]].to_string(index=False))
ワークフロー 2:経路のキーワードに一致するすべての遺伝子を検索
目的:NCBI Gene の概要フィールドから、生物学的なキーワードに関連するヒトの遺伝子をすべて取得します。
import requests, time, pandas as pd
EMAIL = "[email protected]"
BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
keyword = "DNA mismatch repair"
r = requests.get(f"{BASE}/esearch.fcgi",
params={"db": "gene", "email": EMAIL, "retmode": "json",
"retmax": 50,
"term": f"{keyword}[title/abstract] AND Homo sapiens[orgn] AND alive[prop]"})
ids = r.json()["esearchresult"]["idlist"]
print(f"Found {len(ids)} genes related to '{keyword}'")
# Fetch summaries
r2 = requests.post(f"{BASE}/esummary.fcgi",
data={"db": "gene", "id": ",".join(ids), "retmode": "json", "email": EMAIL})
result = r2.json()["result"]
rows = []
for uid in result.get("uids", []):
g = result[uid]
rows.append({"gene_id": uid, "symbol": g.get("name"),
"description": g.get("description"),
"location": g.get("maplocation")})
df = pd.DataFrame(rows)
print(df.to_string(index=False))
df.to_csv(f"{keyword.replace(' ', '_')}_genes.csv", index=False)
主なパラメーター
| パラメーター | モジュール | デフォルト | 範囲/オプション | 効果 |
|---|---|---|---|---|
retmax | ESearch | 20 | 1–10000 | 返されるレコードの最大数 |
retmode | ESearch/ESummary | "xml" | "json", "xml" | レスポンス形式 |
rettype | EFetch | 依存 | "xml", "gene_table", "text" | 全件取得時のレコード形式 |
[sym] フィールドタグ | ESearch | — | 遺伝子シンボル | 正式なシンボルとの完全一致のみ |
[orgn] フィールドタグ | ESearch | — | 生物名または分類 ID | 分類で絞り込み |
alive[prop] | ESearch | — | ブール値フラグ | 廃止された遺伝子レコードを除外 |
ベストプラクティス
-
必ず
alive[prop]を追加する:廃止された遺伝子レコードもデータベースに残っています。このフィルターがないと、シンボル検索で古いレコードが返されることがあります。 -
パイプラインでは Gene ID を使用する:下流の NCBI データベース(ClinVar、dbSNP、GEO)は Gene ID を受け付けます。呼び出しごとにシンボルで再検索するのは避けてください。
-
メタデータには ESummary、全レコードには EFetch を使用する:ESummary は一般的なフィールドをすべて含む JSON を返します。RefSeq アクセッション、GO ターム、または相互作用リンクが必要な場合にのみ EFetch XML を使用してください。
-
無料の API キーに登録する:https://www.ncbi.nlm.nih.gov/account/ でレート制限を 3 req/s から 10 req/s に引き上げられます。
api_keyパラメーターとして渡してください。 -
ESummary でバッチ処理する:1 件ずつクエリする代わりに、1 回の ESummary 呼び出しで最大 200 件の Gene ID を POST できます。
よく使うレシピ
レシピ:Gene ID から RefSeq NM アクセッションを取得する
使用する場面:タンパク質をコードする遺伝子の標準 mRNA アクセッションを取得します。
import requests, re
EMAIL = "[email protected]"
GENE_ID = "672" # BRCA1
r = requests.get(
"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi",
params={"db": "gene", "id": GENE_ID, "rettype": "gene_table",
"retmode": "text", "email": EMAIL}
)
nm_accessions = re.findall(r"NM_\d+\.\d+", r.text)
print(f"RefSeq mRNA accessions: {list(set(nm_accessions))}")
レシピ:遺伝子の別名を取得する
使用する場面:旧シンボルや別名を、現在の正式な NCBI シンボルに対応付けます。
import requests
EMAIL = "[email protected]"
# P53 is an alias for TP53
r = requests.get(
"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi",
params={"db": "gene", "email": EMAIL, "retmode": "json",
"term": "p53[sym] AND Homo sapiens[orgn] AND alive[prop]"}
)
ids = r.json()["esearchresult"]["idlist"]
r2 = requests.post("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi",
data={"db": "gene", "id": ",".join(ids[:1]),
"retmode": "json", "email": EMAIL})
g = r2.json()["result"][ids[0]]
print(f"Official symbol : {g.get('nomenclaturesymbol', g.get('name'))}")
print(f"Other aliases : {g.get('otheraliases')}")
print(f"Designations : {g.get('otherdesignations', '')[:100]}")
レシピ:染色体上のすべての遺伝子を一覧表示する
使用する場面:特定のヒト染色体上にある、タンパク質をコードするすべての遺伝子を取得します。
import requests
EMAIL = "[email protected]"
r = requests.get(
"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi",
params={"db": "gene", "email": EMAIL, "retmode": "json", "retmax": 5,
"term": "17[chr] AND Homo sapiens[orgn] AND protein coding[filter] AND alive[prop]"}
)
result = r.json()["esearchresult"]
print(f"Protein-coding genes on chr17: {result['count']} total")
print(f"Sample IDs: {result['idlist']}")
トラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
既知のシンボルで idlist が空になる | シンボルが正式な名称ではなく別名である | [gene name] または [title] フィールドタグを使用します。ESummary で別名を確認してください |
| 誤った種が返される | 生物フィルターがない | AND Homo sapiens[orgn] または対象の分類 ID(9606[taxid])を追加します |
| 廃止された遺伝子が返される | alive[prop] フィルターがない | すべてのシンボルクエリに AND alive[prop] を追加します |
HTTP 429 レート制限 | リクエストが多すぎる | 呼び出しの間に time.sleep(0.35) を追加します。NCBI API キーを使用してください |
ESummary に uids キーがない | すべての ID が無効または存在しない | id の値が空文字列ではなく、有効な整数であることを確認します |
| XML 解析エラー | まれな遺伝子で XML の形式が不正 | ET.fromstring を try/except で囲み、rettype=text で再試行します |
| ELink から直系遺伝子のリストが空で返される | 旧式の linkname=gene_gene_homolog は、2019 年の HomoloGene 廃止に伴い終了 | 代わりに NCBI Datasets v2 /gene/id/{gene_id}/orthologs を使用します(クエリ 6) |
関連スキル
geo-database— ここで見つかった遺伝子に関連付けられた発現データを取得するための Gene Expression Omnibusclinvar-database— NCBI Gene ID でインデックスされた臨床的バリアントデータensembl-database— VEP と比較ゲノミクスによる補完的な遺伝子アノテーションbiopython-molecular-biology— Biopython の Entrez モジュールは、型付きの戻り値で E-utilities をラップします
参考資料
- NCBI Gene データベース — 公式ホームページと検索インターフェース
- E-utilities ドキュメント — ESearch、ESummary、EFetch の完全な API リファレンス
- NCBI Gene フィールドタグ — Entrez クエリを構成するためのフィールドタグのリファレンス
- NCBI API キー登録 — レート制限を 10 req/s に引き上げる無料登録
- NCBI Datasets v2 REST API — 直系遺伝子、遺伝子メタデータ、分類に対応する最新のエンドポイント(廃止された HomoloGene の後継)