Entrez epost + elink возвращает результаты не в порядке с Biopython
Я столкнулся с этим сегодня и хотел бросить это там. Похоже, что используя интерфейс Biopython для Entrez в NCBI, невозможно получить результаты обратно (по крайней мере от elink) в правильном (так же, как и ввод) порядке. Пожалуйста, смотрите код ниже для примера. У меня есть тысячи GI, для которых мне нужно получить информацию о таксономии, и индивидуальный запрос к ним мучительно медленный из-за ограничений NCBI.
from Bio import Entrez
Entrez.email = "my@email.com"
ids = ["148908191", "297793721", "48525513", "507118461"]
search_results = Entrez.read(Entrez.epost("protein", id=','.join(ids)))
webenv = search_results["WebEnv"]
query_key = search_results["QueryKey"]
print Entrez.read(Entrez.elink(webenv=webenv,
query_key=query_key,
dbfrom="protein",
db="taxonomy"))
print "-------"
for i in ids:
search_results = Entrez.read(Entrez.epost("protein", id=i))
webenv = search_results["WebEnv"]
query_key = search_results["QueryKey"]
print Entrez.read(Entrez.elink(webenv=webenv,
query_key=query_key,
dbfrom="protein",
db="taxonomy"))
Результаты:
[{u'LinkSetDb': [{u'DbTo': 'taxonomy', u'Link': [{u'Id': '211604'}, {u'Id': '81972'}, {u'Id': '32630'}, {u'Id': '3332'}], u'LinkName': 'protein_taxonomy'}], u'DbFrom': 'protein', u'IdList': ['148908191', '297793721', '48525513', '507118461'], u'LinkSetDbHistory': [], u'ERROR': []}]
-------
[{u'LinkSetDb': [{u'DbTo': 'taxonomy', u'Link': [{u'Id': '3332'}], u'LinkName': 'protein_taxonomy'}], u'DbFrom': 'protein', u'IdList': ['148908191'], u'LinkSetDbHistory': [], u'ERROR': []}]
[{u'LinkSetDb': [{u'DbTo': 'taxonomy', u'Link': [{u'Id': '81972'}], u'LinkName': 'protein_taxonomy'}], u'DbFrom': 'protein', u'IdList': ['297793721'], u'LinkSetDbHistory': [], u'ERROR': []}]
[{u'LinkSetDb': [{u'DbTo': 'taxonomy', u'Link': [{u'Id': '211604'}], u'LinkName': 'protein_taxonomy'}], u'DbFrom': 'protein', u'IdList': ['48525513'], u'LinkSetDbHistory': [], u'ERROR': []}]
[{u'LinkSetDb': [{u'DbTo': 'taxonomy', u'Link': [{u'Id': '32630'}], u'LinkName': 'protein_taxonomy'}], u'DbFrom': 'protein', u'IdList': ['507118461'], u'LinkSetDbHistory': [], u'ERROR': []}]
Документация elink ( http://www.ncbi.nlm.nih.gov/books/NBK25499/) в NCBI говорит, что это должно быть возможно, но только путем передачи нескольких 'id=', но это не представляется возможным с Интерфейс биопиона epost. Кто-нибудь еще видел это или я упускаю что-то очевидное.
Спасибо!
1 ответ
from Bio import Entrez
Entrez.email = "my@email.com"
ids = ["148908191", "297793721", "48525513", "507118461"]
search_results = Entrez.read(Entrez.epost("protein", id=','.join(ids)))
xml = Entrez.efetch("protein",
query_key=search_results["QueryKey"],
WebEnv=search_results["WebEnv"],
rettype="gp",
retmode="xml")
for record in Entrez.read(xml):
print [x[3:] for x in record["GBSeq_other-seqids"] if x.startswith("gi")]
gb_quals = record["GBSeq_feature-table"][0]["GBFeature_quals"]
for qualifier in gb_quals:
if qualifier["GBQualifier_name"] == "db_xref":
print qualifier["GBQualifier_value"]
# Or with list comprehension
# print [q["GBQualifier_value"] for q in
# record["GBSeq_feature-table"][0]["GBFeature_quals"] if
# q["GBQualifier_name"] == "db_xref"]
xml.close()
я efetch
запрос, а затем синтаксический анализ XML после чтения его с Entrez.read()
, Это где вещи становятся грязными, и вы должны погрузиться в список xml-dict-list. Я предполагаю, что есть способ извлечь "GBFeature_quals", где "GBQualifier_name" лучше "db_xref", чем мой... но это работает (сейчас). Выход:
['148908191']
taxon:3332
['297793721']
taxon:81972
['48525513']
taxon:211604
['507118461']
taxon:32630