Этот пример показывает, как программно искать и получить данные от баз данных Entrez NCBI с помощью Утилит NCBI Entrez (электронные Утилиты).
Электронные утилиты (eUtils) являются программами серверной стороны (например, ESearch, ESummary, EFetch, и т.д.) разработанный и сохраняемый NCBI для того, чтобы искать и получить данные от большинства Баз данных Entpwdrez. Вы получаете доступ к инструментам через URL со строгим синтаксисом определенного базового URL, вызова скрипта eUtil и его связанных параметров. Для получения дополнительной информации на eUtils, смотрите электронную Сервисную Справку.
В этом примере мы считаем гены упорядоченными от вируса H5N1, изолированного в 1 997 от курицы в Гонконге как отправная точка для нашего анализа. Этот конкретный вирус спрыгнул с цыплят людям, уничтожив шесть человек, прежде чем распространение болезни было подчинено контролю путем уничтожения всей домашней птицы в Гонконге [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. Отчет содержит информацию о выполняемом запросе, какая база данных искалась и UIDs (уникальные идентификаторы) к записям, которые совпадают с запросом. Если вы используете сервер истории, отчет содержит два дополнительных идентификатора, WebEnv
и query_key
, для доступа к результатам. WebEnv
является местоположением результатов на сервере, и query_key
является номером, индексирующим выполняемые запросы. Поскольку WebEnv и query_key
являются зависимым запроса, которого они изменят каждый раз, когда поиск выполняется. Или UIDs или 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 требует входа, который база данных для доступа и который записывает, чтобы получить, идентифицированный или списком UIDs прошел через параметр id
или параметрами query_key
и WebEnv
. 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, чтобы просмотреть информацию из отчета ESummary XML в веб-браузере. Для получения дополнительной информации о записи таблиц стилей XSL смотрите W3C® XSL. Таблица стилей XSL была создана для этого примера, чтобы просмотреть информацию о сводных данных последовательности и обеспечить ссылки на их полные файлы GenBank®. Xslt
может использоваться, чтобы просмотреть отчет XML в веб-браузере от MATLAB®.
xslt(summaryFname,'genbankSummary.xsl','-web');
Чтобы выполнить анализ последовательности, необходимо получить полную запись GenBank для каждой последовательности. EFetch получает полные отчеты из баз данных Entrez. EFetch требует входа базы данных и списка UIDs или WebEnv
и query_key
. Кроме того, EFetch может возвратить выходной параметр в различных форматах. Можно задать, какой выходной формат (т.е. GenBank (gb
), FASTA) и формат файла (т.е. текст, ASN.1, XML) вы хотите через rettype
и параметры retmode
, соответственно. Rettype
равняется gb
для формата файла GenBank, и retmode
равняется text
для этого запроса. Genbankread
может использоваться непосредственно с EFetch URL, чтобы получить все записи 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 с UIDs для записей в PubMed. Эти UIDs могут быть проанализированы из отчета и переданы другому eUtils (например, ESummary). Используйте таблицу стилей, созданную для просмотра ESummary, сообщает, чтобы просмотреть результаты ELink.
elinkReport = webread([baseURL... 'elink.fcgi?dbfrom=nuccore&db=pubmed&WebEnv=', ncbi.WebEnv,... '&query_key=',ncbi.QueryKey]);
Извлеките PubMed UIDs из отчета 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 для сообщений UIDs к серверу истории. Это возвращает отчет 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] Cristianini, N. и Хан, M.W. "Введение в вычислительную геномику: подход тематических исследований", издательство Кембриджского университета, 2007.