Доступ к базам данных NCBI Entrez с помощью E-утилит

В этом примере показано, как программно искать и извлекать данные из баз данных Entrez NCBI с помощью утилит Entrez (E-Utilities) NCBI.

Использование E-утилит NCBI для извлечения биологических данных

E-Utilities (eUtils) - серверные программы (например, ESearch, ESummary, EFetch и т.д.), разработанные и поддерживаемые NCBI для поиска и извлечения данных из большинства баз данных Entpwdrez. Вы получаете доступ к инструментам через URL со строгим синтаксисом определенного базового URL, вызовом скрипта eUtil и связанными с ним параметрами. Для получения дополнительной информации об eUtils см. справку по E-Utilities.

Поиск по нуклеотидной базе данных с ESearch

В этом примере мы рассматриваем гены, секвенированные из вируса 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...'

Получение сводных данных файлов GenBank ® с ESummary

Чтобы получить быстрый обзор последовательностей, соответствующих запросу, можно использовать 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

Для выполнения анализа последовательности необходимо получить полную запись 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)

Поиск ссылок между базами данных с ELink

Может быть полезно иметь статьи 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

Проводка UID на сервер истории NCBI с EPost

Можно использовать 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 для поиска связанных файлов в одной базе данных

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');

Использование EGQuery для получения глобального представления о H5N1 связанных записях в Entrez

Чтобы увидеть, какие другие базы данных 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.