File size: 2,130 Bytes
fa66973
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"""调试:反向链路 —— 短 RNA(nuccore)→ 文献(pubmed)→ 摘要。

正向链路(pubmed→nuccore)实测拿到的都是 2–4 kb 的完整 mRNA,
全部超过 RNA-FM 的 1024 nt 上限,被过滤光了。
所以改用反向:**先找短 RNA 序列**,再反向找它们的文献。
"""

from __future__ import annotations

import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "src"))

from rnaqwen.data.sources import Entrez, parse_fasta, parse_pubmed_xml  # noqa: E402

QUERIES = {
    "refseq_ncrna_short": 'biomol_rna[prop] AND srcdb_refseq[prop] AND 60:1000[slen] AND '
                          '("non-coding RNA"[Title] OR "lncRNA"[Title] OR "miRNA"[Title] '
                          'OR "snoRNA"[Title] OR "riboswitch"[Title] OR "ribozyme"[Title])',
    "mirna_precursor": '"miRNA"[Title] AND 60:300[slen] AND biomol_rna[prop]',
    "riboswitch": 'riboswitch[Title] AND 60:600[slen] AND biomol_rna[prop]',
    "trna": '"tRNA"[Title] AND 60:200[slen] AND biomol_rna[prop]',
}


def main() -> int:
    ez = Entrez()
    for name, q in QUERIES.items():
        ids = ez.esearch("nuccore", q, retmax=5)
        print(f"\n=== {name} === term={q[:90]}...")
        print(f"  前 5 个 nuccore id: {ids}")
        if not ids:
            continue
        fasta = parse_fasta(ez.efetch("nuccore", ids, retmode="text", rettype="fasta"))
        for acc, defn, seq in fasta:
            print(f"    {acc:16s} len={len(seq):5d} {defn[:80]}")
        links = ez.elink("nuccore", "pubmed", ids)
        n_links = sum(len(v) for v in links.values())
        print(f"    -> pubmed 链接数: {n_links}  ({ {k: v[:3] for k, v in list(links.items())[:3]} })")
        pmids = sorted({p for v in links.values() for p in v})[:3]
        if pmids:
            lit = parse_pubmed_xml(ez.efetch("pubmed", pmids, retmode="xml"))
            for pmid, meta in list(lit.items())[:2]:
                print(f"    PMID {pmid}: abstract={len(meta['abstract'])} 字符 | {meta['title'][:70]}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())