В этом примере показано, как программно искать и извлекать данные из баз данных Entrez NCBI с помощью Entrez Utilities (E-Utilities).
E-Utilities (eUtils) - это серверные программы (например, ESearch, ESummary, EFetch и т.д.), разработанные и поддерживаемые NCBI для поиска и извлечения данных из большинства баз данных Entpwdrez. Доступ к инструментам осуществляется через URL-адреса со строгим синтаксисом определенного базового URL-адреса, вызова сценария eUtil и связанных с ним параметров. Дополнительные сведения об eUtils см. в справке E-Utilities.
В этом примере мы рассматриваем гены, секвенированные из вируса H5N1, выделенного в 1997 году из курицы в Гонконге, в качестве отправной точки для нашего анализа. Этот вирус перескочил от кур к людям, убив шесть человек до того, как распространение болезни было поставлено под контроль, уничтожив всю птицу в Гонконге [1]. Для поиска данных последовательности, необходимых для анализа, можно использовать ESearch. ESearch требует ввода базы данных (db) и поисковый термин (term). Дополнительно можно запросить ESearch для хранения результатов поиска на сервере истории NCBI через usehistory параметр.
baseURL = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/'; eutil = 'esearch.fcgi?'; dbParam = 'db=nuccore'; termParam = '&term=A/chicken/Hong+Kong/915/97+OR+A/chicken/Hong+Kong/915/1997'; usehistoryParam = '&usehistory=y'; esearchURL = [baseURL, eutil, dbParam, termParam, usehistoryParam]
esearchURL = 1×145 char array http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=nuccore&term=A/chicken/Hong+Kong/915/97+OR+A/chicken/Hong+Kong/915/1997&usehistory=y
term может быть любым допустимым запросом Entrez. Обратите внимание, что в URL-адресе не может быть пробелов, поэтому параметры разделяются символом «» & «», и любые пробелы в выражении запроса должны быть заменены на «» + «» (например, «» Hong + Kong «»).
Вы можете использовать webread для отправки URL-адреса и возврата результатов из ESearch в виде символьного массива.
searchReport = webread(esearchURL)
searchReport = 1×1714 char array <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE eSearchResult PUBLIC "-//NLM//DTD esearch 20060628//EN" "http://eutils.ncbi.nlm.nih.gov/eutils/dtd/20060628/esearch.dtd"> <eSearchResult><Count>8</Count><RetMax>8</RetMax><RetStart>0</RetStart><QueryKey>1</QueryKey><WebEnv>NCID_1_3777459_130.14.22.215_9001_1464976330_1306835914_0MetA0_S_MegaStore_F_1</WebEnv><IdList> <Id>6048802</Id> <Id>6048927</Id> <Id>6048903</Id> <Id>6048875</Id> <Id>6048849</Id> <Id>6048829</Id> <Id>6048770</Id> <Id>3421265</Id> </IdList><TranslationSet/><TranslationStack> <TermSet> <Term>A/chicken/Hong[All Fields]</Term> <Field>All Fields</Field> <Count>1076</Count> <Explode>N</Explode> </TermSet> <TermSet> <Term>Kong/915/97[All Fields]</Term> <Field>All Fields</Field> <Count>7</Count> <Explode>N</Explode> </TermSet> <OP>AND</OP> <OP>GROUP</OP> <TermSet> <Term>A/chicken/Hong[All Fields]</Term> <Field>All Fields</Field> <Count>1076</Count> <Explode>N</Explode> </TermSet> <TermSet> <Term>Kong[All Fields]</Term> <Field>All Fields</Field> <Count>2352376</Count> <Explode>N</Explode> </TermSet> <OP>AND</OP> <TermSet> <Term>915[All Fields]</Term> <Field>All Fields</Field> <Count>93686</Count> <Explode>N</Explode> </TermSet> <OP>AND</OP> <TermSet> <Term>1997[All Fields]</Term> <Field>All Fields</Field> <Count>473107</Count> <Explode>N</Explode> </TermSet> <OP>AND</OP> <OP>GROUP</OP> <OP>OR</OP> </TranslationStack><QueryTranslation>(A/chicken/Hong[All Fields] AND Kong/915/97[All Fields]) OR (A/chicken/Hong[All Fields] AND Kong[All Fields] AND 915[All Fields] AND 1997[All Fields])</QueryTranslation></eSearchResult>
ESearch возвращает результаты поиска в формате XML. Отчет содержит информацию о выполненном запросе, в какой базе данных выполнялся поиск, и идентификаторы UID (уникальные идентификаторы) для записей, соответствующих запросу. При использовании сервера истории отчет содержит два дополнительных идентификатора, WebEnv и query_key, для доступа к результатам. WebEnv - расположение результатов на сервере, и query_key - это число, индексирующее выполненные запросы. Начиная с WebEnv и query_key зависят от запроса и будут изменяться каждый раз при выполнении поиска. UID или WebEnv и query_key может быть проанализирован из XML-отчета, а затем передан в другие eUtils. Вы можете использовать regexp для выполнения синтаксического анализа и сохранения маркеров в структуре с полевыми именами WebEnv и QueryKey.
ncbi = regexp(searchReport,... '<QueryKey>(?<QueryKey>\w+)</QueryKey>\s*<WebEnv>(?<WebEnv>\S+)</WebEnv>',... 'names')
ncbi =
struct with fields:
QueryKey: '1'
WebEnv: 'NCID_1_3777459_130.14.22.215_9001_1464976330_1306835914_0Me...'
Для получения быстрого обзора последовательностей, соответствующих запросу, можно использовать ESummary. ESummary извлекает краткую сводку или сводку документов (DocSum) для каждой записи. ESummary требует ввода какой базы данных для доступа и какие записи для извлечения, идентифицированные либо по списку UID, пропущенных через id параметра или по WebEnv и query_key параметры. ESummary возвращает отчет в формате XML, содержащий сводную информацию для каждой записи. Использовать websave с помощью ESummary для выполнения извлечения сводки записей и записи XML-отчета в файл.
tmpDirectory = tempdir; summaryFname = fullfile(tmpDirectory,'summaryReport.xml'); websave(summaryFname, [baseURL... 'esummary.fcgi?db=nuccore&WebEnv=',ncbi.WebEnv,... '&query_key=',ncbi.QueryKey]);
Можно создать таблицу стилей XSL для просмотра информации из XML-отчета ESummary в веб-браузере. Дополнительные сведения о написании таблиц стилей XSL см. в разделе W3C ® XSL. Таблица стилей XSL была создана для этого примера, чтобы просмотреть сводную информацию о последовательности и предоставить ссылки на их полные файлы GenBank ®.Xslt может использоваться для просмотра XML-отчета в веб-браузере из MATLAB ®.
xslt(summaryFname,'genbankSummary.xsl','-web');

Для выполнения анализа последовательности необходимо получить полную запись GenBank для каждой последовательности. EFetch извлекает полные записи из баз данных Entrez. EFetch требует ввода базы данных и списка UID или WebEnv и query_key. Кроме того, EFetch может возвращать выходные данные в различных форматах. Можно указать формат вывода (например, GenBank (gb), FASTA) и формат файла (например, текст, ASN.1, XML), который требуется через rettype и retmode параметры, соответственно. Rettype равняется gb для формата файла GenBank и retmode равняется text для этого запроса. Genbankread может использоваться непосредственно с URL EFetch для извлечения всех записей GenBank и их считывания в структурный массив. Эта структура может затем использоваться в качестве входных данных для seqviewer для визуализации последовательностей.
ch97struct = genbankread([baseURL... 'efetch.fcgi?db=nuccore&rettype=gb&retmode=text&WebEnv=',ncbi.WebEnv,... '&query_key=',ncbi.QueryKey]); seqviewer(ch97struct)

Может быть полезно иметь статьи PubMed, связанные с этими генами. ELink обеспечивает эту функциональность. Он находит связи между записями внутри баз данных или между ними. Вы можете дать ELink идентификаторы query_key и WebEnv сверху и попросить его найти записи в базе данных PubMed (db параметр), связанный с вашими записями из базы данных нуклеотидов (nuccore) (dbfrom параметр). ELink возвращает XML-отчет с UID для записей в PubMed. Эти UID могут быть проанализированы из отчета и переданы в другие eUtils (например, ESummary). Таблица стилей, созданная для просмотра отчетов ESummary, используется для просмотра результатов ELink.
elinkReport = webread([baseURL... 'elink.fcgi?dbfrom=nuccore&db=pubmed&WebEnv=', ncbi.WebEnv,... '&query_key=',ncbi.QueryKey]);
Извлеките UID PubMed из отчета ELink.
pubmedIDs = regexp(elinkReport,'<Link>\s+<Id>(\w*)</Id>\s+</Link>','tokens'); NumberOfArticles = numel(pubmedIDs) % Put PubMed UIDs into a string that can be read by EPost URL. pubmed_str = []; for ii = 1:NumberOfArticles pubmed_str = sprintf([pubmed_str '%s,'],char(pubmedIDs{ii})); end
NumberOfArticles =
2
EPost можно использовать для разноски UID на сервер истории. Он возвращает XML-отчет с query_key и WebEnv Идентификаторы, указывающие на расположение сервера истории. Опять же, они могут быть проанализированы из отчета и использованы с другими вызовами eUtils.
epostReport = webread([baseURL 'epost.fcgi?db=pubmed&id=',pubmed_str(1:end-1)]); epostKeys = regexp(epostReport,... '<QueryKey>(?<QueryKey>\w+)</QueryKey>\s*<WebEnv>(?<WebEnv>\S+)</WebEnv>','names')
epostKeys =
struct with fields:
QueryKey: '1'
WebEnv: 'NCID_1_3778415_130.14.22.215_9001_1464976335_906725031_0Met...'
ELink может выполнять поиск в базе данных. Например, можно запросить нуклеотидную последовательность в базе данных нуклеотидов (nuccore), чтобы найти аналогичные последовательности, по существу выполняя BLAST-поиск. Для поиска в базе данных «внутри» ELink возвращает XML-отчет, содержащий связанные записи, а также ранжирование оценки его связи с записью запроса. Из вышеприведенного поиска PubMed вам может быть интересно найти все статьи, связанные с этими статьями в PubMed. Это легко сделать с ELink. Чтобы выполнить поиск в базе данных «внутри», установите db и dbfrom в PubMed. Вы можете использовать query_key и WebEnv из вызова EPost.
pm2pmReport = webread([baseURL... 'elink.fcgi?dbfrom=pubmed&db=pubmed&query_key=',epostKeys.QueryKey,... '&WebEnv=',epostKeys.WebEnv]); pubmedIDs = regexp(pm2pmReport,'(?<=<Id>)\w*(?=</Id>)','match'); NumberOfArticles = numel(unique(pubmedIDs)) pubmed_str = []; for ii = 1:NumberOfArticles pubmed_str = sprintf([pubmed_str '%s,'],char(pubmedIDs{ii})); end
NumberOfArticles = 526
Использовать websave с помощью EFetch для извлечения полных рефератов для статей и записи возвращенного XML-отчета в файл. В этом примере приводится таблица стилей XSL для просмотра результатов запроса EFetch. XML-отчет может быть преобразован с помощью таблицы стилей и открыт в веб-браузере из MATLAB с помощью xslt.
fullFname = fullfile(tmpDirectory,'H5N1_relatedArticles.xml'); websave(fullFname, [baseURL 'efetch.fcgi?db=pubmed&retmode=xml&id=',... pubmed_str(1:end-1)]); xslt(fullFname,'pubmedFullReport.xsl','-web');

Чтобы узнать, какие другие базы данных Entrez содержат информацию о H5N1 вирусе, используйте EGQuery. EGQuery выполняет текстовый поиск по всем доступным базам данных Entrez и возвращает количество попаданий в каждой базе данных. EGQuery принимает любой допустимый текстовый запрос Entrez в качестве ввода через term параметр.
entrezSearch = webread([baseURL,'egquery.fcgi?term=H5N1+AND+virus']); entrezResults = regexp(entrezSearch,... '<DbName>(?<DB>\w+\s*\w*)</DbName>.*?(<Count>)(?<Count>\d+)</Count>',... 'names'); entrezDBs = {entrezResults(:).DB}; dbCounts = str2double({entrezResults(:).Count}); entrezDBs = entrezDBs(logical(dbCounts)); % remove databases with no records [dbCounts,sortInd] = sort(dbCounts(logical(dbCounts))); entrezDBs = entrezDBs(sortInd); numDBs = numel(entrezDBs); barh(log10(dbCounts)); ylim([.5 numDBs+.5]) ax = gca; ax.YTick = 1:numDBs; ax.YTickLabel = entrezDBs; xlabel('Log(Number of Records)'); title('Number of H5N1 Related-Records Per Entrez Database');

[1] Криштианини, Н. и Хан, М.В. «Введение в вычислительную геномику: подход к тематическим исследованиям», Cambridge University Press, 2007.