В этом примере показано, как программно искать и извлекать данные из баз данных Entrez NCBI с помощью утилит Entrez (E-Utilities) NCBI.
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
The 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. Отчет содержит информацию о выполненном запросе, о базе данных, в которой был выполнен поиск, и идентификаторах пользователя (уникальных идентификаторах) записей, соответствующих запросу. Если вы используете сервер history, отчет содержит два дополнительных идентификатора 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
для формата и retmode
файлов GenBank равен
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
параметр), сопоставленный с вашими записями из базы данных Nucleotide (nuccore) Database (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 может выполнять поиск «внутри» базы данных. Например, можно запросить нуклеотидную последовательность в базе данных Nucleotide (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] Cristianini, N. and Hahn, M.W. «Introduction to Computational Genomics: A Case Studies Approach», Cambridge University Press, 2007.