Uniprot,全名Universal Protein,其整合了Swissprot、TrEMBL和PRI-PSD三大數據庫,是目前使用非常廣泛的蛋白質數據庫
常規物種的蛋白質組學研究一般會使用Uniprot數據庫的蛋白序列作為查庫序列,因此蛋白組學的結果常以uniprot ID作為識別ID,而且Uniprot數據庫還與其他公共庫進行了關聯,豐富了蛋白相關的信息
這里主要是對Uniprot的API進行一個小結。之前略微了解過KEGG的API,能非常方便的通過URL以及編程命令輕松訪問KEGG數據庫獲取所需要的信息,Uniprot API也有相同的功能
根據我的使用,我覺得Uniprot的API的使用可以分為三個部分:
- 獲取單個蛋白ID(uniprot accession id)所對應的所有信息
- ID mapping的API
- 查詢訪問性質的API
第一部分
可以理解為訪問Uniprot數據的一個小技巧,雖然不是很實用,但是有時還是可以湊合用用的,可以粗略認為是通過編輯URL來訪問數據庫
如:我想獲取Q9UM73這個蛋白的fasta序列,那么用下面這個URL即可
http://www.uniprot.org/uniprot/Q9UM73.fasta
如果想獲取Q9UM73這個蛋白的全面信息,可以有以下形式展示:txt,xml以及GFF
http://www.uniprot.org/uniprot/Q9UM73.txt http://www.uniprot.org/uniprot/Q9UM73.xml http://www.uniprot.org/uniprot/Q9UM73.GFF
至於這個URL怎么用呢,可以通過perl/R(我現在只會這兩個。。。)以訪問網頁的形式將上述URL的內容抓下來,perl的話用內置的get()
函數即可,R的話用RCurl
包;通過這個方法我們可以批量下載蛋白信息,避免手動去Uniprot網頁上下載這一過程(雖然其網頁操作做的很人性化,簡單易操作)
第二部分
則是Uniprot的idmapping功能對應的API,這是我覺得在Uniprot中最好用的功能之一,對於這個API,Uniprot特別還對其用法進行的實例講解,如http://www.uniprot.org/help/api_idmapping
從網頁上我們就能看到Uniprot對於這個API的使用給了4種編程語言的例子,有Perl,Python,Ruby和Java,很可惜我只會第一種;點擊即可查看例子,以Perl代碼來說,其主要通過LWP::UserAgent模塊對Uniprot這個API發送訪問請求,基本原來就是爬蟲,然后返回信息;只要按照其代碼,模仿的寫一下就能使用的,這里不再詳細說明了
但是我更想了解如何用R來實用上述功能,雖然Uniprot沒有給出R語言的例子,但是只要是基於爬蟲的,R也是能實現的;可惜至今為止,我還未學習用R爬蟲來抓取信息,所以只好求助於Github上的有無大神分享過相關代碼,結果還真讓我找到一個:https://github.com/sehanson/Uniprot_API_R/blob/master/Uniprot_API,代碼簡潔易懂,非常棒!
library(httr) e_mail <- '' #Enter your email address here to help hosts troubleshoot issues us_er <- paste0('R ', e_mail) acc1 <- '' #Enter the starting accession id (e.g. 'ACC' for Uniprot accession) acc2 <- '' #Enter the target accession id (e.g. 'HPA_ID' for Human Protein Atlas accession) fmt <- '' #Enter format (e.g. 'tab' for TSV) qry <- '' #Enter query term user_agent(us_er) r <- POST('http://www.uniprot.org/uploadlists/', body = list(from= acc1, to = acc2, format = fmt, query = qry), encode = "form") print(r)
從上述代碼中可以看到是使用httr
包按照一定格式發送訪問請求,然后返回數據;其返回的r變量是response格式,無法直接解讀的,我也粗略找了下,先使用httr
包的content()
函數范圍r變量中的內容,然后再使用readr
包中的read_tsv()
函數即可對上述數據解讀為數據庫形式
a <- content(r, type = "text") b <- read_tsv(a)
不僅會使用代碼,而且還需了解Uniprot這個API提供了哪些功能,所有ID mapping的功能可見網站http://www.uniprot.org/help/api_idmapping下面的表格,其展示了所有能進行的ID轉化(其實也就是這個網址http://www.uniprot.org/uploadlists/下所對應的所有功能)
一般來說我們是希望找出accession id所對應的其他數據庫的ID,如:想將找出P31946和P62258這個兩個蛋白對應的KEGG數據的K號,那么代碼如下所示
e_mail <- 'gukai1212@163.com' #Enter your email address here to help hosts troubleshoot issues us_er <- paste0('R ', e_mail) acc1 <- 'ACC' #Enter the starting accession id (e.g. 'ACC' for Uniprot accession) acc2 <- 'KO_ID' #Enter the target accession id (e.g. 'HPA_ID' for Human Protein Atlas accession) fmt <- 'tab' #Enter format (e.g. 'tab' for TSV) qry <- "P31946,P62258" #Enter query term user_agent(us_er) r <- POST('http://www.uniprot.org/uploadlists/', body = list(from= acc1, to = acc2, format = fmt, query = qry), encode = "form") a <- content(r, type = "text") b <- read_tsv(a)
結果如下:
# A tibble: 2 x 2 From To <chr> <chr> 1 P31946 K16197 2 P62258 K06630
其他ID的轉化也是類似的,但是每次只支持一類ID轉化為另一類ID,不支持一類轉化為多類;但總體上還是蠻實用的,能夠批量的進行ID轉化,而且能寫入其他程序和腳本中,只要能爬蟲的編程語言都能實現其功能
第三部分
個人覺得其功能非常強大,可以先看幾個Uniprot給的例子http://www.uniprot.org/help/api_queries
從其例子上可看出,這個API覆蓋了Unirpot查詢的所有功能,只要你懂得起URL的規則,就可以定制出你所想要的結果對應的URL
上述網站給出了URL書寫的格式,最主要的就是query,format和columns,對於query可包含的內容,又可以分出好多個fields,如http://www.uniprot.org/help/text-search和http://www.uniprot.org/help/query-fields
對於columns可包含的內容,可以查看http://www.uniprot.org/help/uniprotkb_column_names
如果你需要查詢的信息來自外部數據庫,Uniprot也是支持的,具體數據庫信息可以查看http://www.uniprot.org/database/
我也是花了不少時間才搞清楚了點,信息量還是蠻大的。比如我一個比較簡單的需求,想列出所有Uniprot數據庫中所有人類swissprot蛋白對應的KEGG的K號和GOid,那么URL則可以這樣寫:
http://www.uniprot.org/uniprot/?query=organism:9606&format=tab&columns=id,reviewed,database(KO),go-id
獲取URL后,我們就可以用腳本將內容從網頁上抓下來,比如R的話,還是用RCurl
包(因為我暫時只會這個。。。)
library(RCurl) library(readr) url.exists(http://www.uniprot.org/uniprot/?query=organism:9606&format=tab&columns=id,reviewed,database(KO),go-id) d <- debugGatherer() tmp <- getURL(url="http://www.uniprot.org/uniprot/?query=organism:9606&format=tab&columns=id,reviewed,database(KO),go-id", debugfunction = d$update, verbose = TRUE) tmp2 <- read_tsv(tmp)
查看下結果(GOID數目有點多,這里沒顯示出來。。。)
> head(tmp2) # A tibble: 6 x 4 Entry Status `Cross-reference (KO)` <chr> <chr> <chr> 1 P62258 reviewed K06630; 2 Q04917 reviewed K16198; 3 P27348 reviewed K16197; 4 P30443 reviewed K06751; 5 P04439 reviewed <NA> 6 P01889 reviewed K06751; # ... with 1 more variables: `Gene ontology IDs` <chr>
總之,Uniprot的API個人覺得功能還是蠻好使的,值得記錄下來