基于NCBI开放接口的检索和下载文献题录信息功能的实现
2017-03-21,
,
NCBI(National Center for Biotechnology Information)是美国国立生物技术信息中心,它提供了庞大的生物医学信息资源和强大可靠的检索工具,被生物医学研究人员广泛使用。
NCBI网站(http://www.ncbi.nlm.nih.gov/)将所有数据库的检索和使用集成在一个界面上,并为开发人员提供了几个开放的API编程接口,便于在他们的应用程序中获取和操作NCBI的数据。E-utilities(Entrez Programming Utilities)是NCBI Entrez检索系统的开放API编程接口,可以访问所有的Entrez数据库,包括PubMed、PMC、Gene、 Nuccore and Protein等。
利用NCBI数据进行文本挖掘和信息分析是目前医学信息研究领域的一个热点,而获取文本数据是这些研究的基础性工作。有介绍NCBI开放编程接口的文献[1-2],也有介绍如何开发基于NCBI开放编程接口各种具体应用的文献[3-10]。但是,有的文献没有详细的接口调用的实例,而有接口调用实例的文献由于“从2015年7月1日后不再提供E-utilities SOAP Web Service 服务[11]”已经不再适用了。现有的文献管理软件如Endnote、NoteExpress等虽然可以提供题录下载,但是却并不包括对于后续文本挖掘和信息分析至关重要引用数据、PMID、Mesh等字段。
本文详细描述了利用标准的URL接口实现检索和批量自动下载PubMed中的文献题录信息的具体过程。该方法可方便获取NCBI论文数据并存入SQL数据库,为后续深度开发文本挖掘和信息分析等功能构建了数据基础。
1 功能目标
根据用户输入的检索式,自动从PubMed数据库中检索出所有相关的文献信息,将其下载后,再从中提取出需要的题录信息,最后存入本地SQL数据库。用于存放题录信息的数据库主要字段见表1。
表1 PubMed 主要字段类型
2 基础架构
E-utilities由9个服务器程序组成,借助E-utilities,可以设置一套标准参数进行搜索、链接和下载数据(表2)[12-14]。本实例在微软的Microsoft Visual Studio 2010平台上,采用C#语言进行开发。操作系统选用Windows Server 2008 Enterprise Edition Service Pack 2 (64bit ),Web服务器选用IIS 7.0,数据库选用Microsoft SQL Server 2008 R2。E-utilities程序开发接口主要选用ESearch,EFetch,发送请求和接收数据选用System.Net.WebClient组件,解析XML数据选用System.Xml组件。
表2 E-utilities API接口及其功能
3 实现流程和关键代码
下载题录信息实现流程见图1。
3.1 检索词规范化
要把用户输入的检索词规范化,以便使它符合E-utilities程序开发接口的要求。例如,要把用户输入的简单检索式“liver cancer AND AFP”,转换成“liver+cancer+AND+AFP”格式。
3.2 下载数据并存入本地数据库
下载数据时,先用EFetch的批量下载方式批量下载。如果有失败的部分,再通过EFetch的单个PMID值下载方式逐条下载。
实现代码如下:
public static bool FetchDataToDB(string query, int searchLogID)
{
//通过ESearch获取参数“WebEnv”,“QueryKey”,“Count”的值
Dictionary
if (parameters == null)
{
return false;
}
int count = int.Parse(parameters[“Count”]);
List
//编译EFetch的URL列表
urlList = GetBatchPMIDUrls(query, count,searchLogID, parameters);
//下载题录数据并存入本地数据库
if (DownloadDataToDBRepeatedly(urlList, searchLogID) == false)
{
return false;
}
//如果有部分下载失败,则通过单个失败的PMID的URL重新下载。
if(DBManager.IsFailurePMID(count,searchLogID))
{
//编译失败部分的单个PMID的EFetch的URL列表
urlList = GetFailedPMIDUrls(query,count,searchLogID);
//下载题录数据并存入本地数据库
if (DownloadDataToDBRepeatedly(urlList, searchLogID) == false)
{
return false;
}
}
return true;
}
图1 下载题录信息流程
3.2.1 EFetch批量下载方式
第一步,通过ESearch获取参数“WebEnv”“QueryKey”“Count”的值。
首先,编译ESearch的URL。例如,根据检索词“liver+cancer+AND+AFP”,形成URL:http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=liver+cancer+AND+AFP&usehistory=y
其次,根据ESearch的URL,引用System.Net.WebClient组件下载xml数据。实现下载功能的具体代码如下:
using System.Net;
using System.Text;
private static string DownloadDataFromSite(string url)
{
string xmlPage =null;
try
{
WebClient MyWebClient = new WebClient();
MyWebClient.Credentials = CredentialCache.DefaultCredentials;
//从网上下载数据
Byte[]pageData = MyWebClient.DownloadData(url);
xmlPage = Encoding.UTF8.GetString(pageData);
}
catch (WebException webEx)
{
LogManager.InsertError(webEx);
}
return xmlPage;
}
最后,引用System.Xml组件解析并提取xml数据中的参数“WebEnv”,“QueryKey”,“Count”的值。
第二步,通过EFetch 的批量下载方式获取文献题录信息。图2是代码实现的详细流程,首先,根据参数“WebEnv”,“QueryKey”,“Count”的值,编译EFetch的URL列表。其中,retmax参数需要根据实际的运行情况并经过多次测试结果而设定。单个EFetch的URL的格式如下:
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&rettype=abstract&retmode=xml&WebEnv=NCID_1_7740069_130.14.22.215_9001_1454423068_1167148892_0MetA0_S_MegaStore_F_1&query_key=1&retstart=0&retmax=500
其次,根据EFetch的URL列表,利用System.Net.WebClient组件下载xml数据。
再次,利用System.Xml组件解析并提取xml数据中题录信息。
最后,把提取的题录信息存入本地数据库。
部分实现代码如下:
Private static bool DownloadDataToDBRepeatedly(List
{
//有时候某些URL下载不成功,需要多次重复下载,这里根据实际情况定了10次
int circleNum = 0;
do
{
urlList = DownloadDataToDB(urlList, searchLogID);
if (urlList == null)
{
return false;
}
circleNum++;
} while (urlList.Count >= 1 && circleNum <= 10);
if (circleNum > 10 && urlList.Count > 0) //如果 urlList.Count==0,表示成功的下载并存入本地数据库。
{
foreach (string url in urlList)
{
PubmedLogger.Log(url + "/r" + "After download it" + circleNum + "times, it is failure! ", LogCategory.Failure);
}
return false;
}
return true;
}
private static List
{
List
bool isSuccessful;
List
foreach (string url in urlList)
{
//从网站下载数据
string xmlPage = DownloadDataFromSite(url);
if (xmlPage == null)
{
FailedUrlList.Add(url);
PubmedLogger.Log(url + "/r" + "There is not the downloaded data. ", LogCategory.Warning); continue;
}
//从xml格式的数据里提取所需的题录信息
articleList = ExtractDataFromXmlPage(xmlPage, searchLogID, url);
if (articleList == null) { FailedUrlList.Add(url); continue; }
//把提取的题录信息存入本地数据库
isSuccessful = PutDataToDB(articleList);
if (isSuccessful == false){ return null;}
}
return FailedUrlList;
}
图 2 EFetch下载题录信息详细流程
3.2.2 EFetch单个PMID值单条下载方式
如果EFetch批量下载方式下载过程中有失败的部分,则通过EFetch单个PMID值单条下载方式逐条下载题录信息并存入本地数据库。
第一步,需要通过ESearch下载xml数据并提取所有相关的PMID值,再跟数据库中成功的部分比较,得到前面批量下载过程中所有失败的PMID值。需要注意的是需下载所有的PMID值,ESearch的URL中需要设置“RetMax”参数值。ESearch的URL格式如下:http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=liver+cancer+AND+AFP&usehistory=y&RetMax=4206
第二步,通过EFetch单个PMID值单条下载方式,逐条下载题录信息并存入本地数据库。下载和保存的实现代码与EFetch批量下载方式中的第二步一样,区别在于EFetch单个PMID值单条下载方式的URL的格式不一样。
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&rettype=abstract&retmode=xml&id=26815502
4 测试结果
测试主要是比对手工检索结果页面显示的总的记录项数目和本地数据库中的记录项数目是否相等,以及比对手工下载的结果文件中的部分内容和本地数据库中由程序代码下载的内容是否相同。由于PubMed数据每天更新,所以测试时要保证手工检索和下载结果文件的时间与通过程序代码下载的时间不能相隔太久。在不同时间段,用不同检索词,进行了多次的测试,得到的结果都是相同的。
5 结语
本文利用NCBI的E-utilities中的ESearch和EFetch两个标准的URL接口,实现了对PubMed数据库的检索和批量自动下载检索结果中的文献题录信息。给出的实现流程和关键代码为进一步文本挖掘和信息分析提供数据基础。