You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让UniprotKB API请求结果与官网搜索结果匹配?

问题原因与解决方案

核心问题

UniProt官网的搜索结果默认按匹配度分数降序排列,但REST API的/uniprotkb/search端点默认不做排序,返回结果的顺序是不确定的——这就是你看到结果和官网不一致的原因。官方文档提到的“流端点不支持排序”,指的是批量导出完整数据集的端点,普通搜索端点是支持指定排序规则的。

代码修改方案

在请求中添加sort=score参数,强制按匹配分数降序排列,就能让REST返回的首个结果和官网一致。修改后的核心函数如下:

fetch_gene_entry <- function(gene) {
  query <- paste0(gene, " AND organism_id:10090")  # mouse
  res <- tryCatch(
    {
      # 添加sort=score参数,按匹配分数降序排序
      GET(uq_url, query = list(query = query, fields = fields, format = "json", size = 1, sort = "score"))
    },
    error = function(e) {
      message("Request failed for ", gene, ": ", e$message)
      return(NULL)
    })
  if (is.null(res) || res$status_code != 200) {
    print("res is NULL")
    return(NULL)}
  
  j <- content(res)
  if (is.null(j$results) || length(j$results) == 0) {
    print("j is NULL")
    return(NULL)}
  
  hit <- j$results[[1]]
  
  symbol <- NA
  pname <- NA
  if (!is.null(hit$genes) && length(hit$genes) > 0)
    symbol <- hit$genes[[1]]$geneName$value
  if (!is.null(hit$proteinDescription$recommendedName$fullName$value))
    pname <- hit$proteinDescription$recommendedName$fullName$value
  
  data.frame(
    input_gene = gene,
    accession = ifelse(is.null(hit$primaryAccession), NA, hit$primaryAccession),
    gene_symbol = symbol,
    protein_name = pname,
    stringsAsFactors = FALSE
  )
}

额外优化建议

  • 处理特殊字符:对于带括号、空格的查询字符串,可提前用URLencode()处理,避免潜在的解析问题。
  • 增加重试逻辑:用purrr::retry()给失败请求添加重试机制,提升稳定性。
  • 完善日志:把无结果的查询、错误详情记录得更具体,方便后续排查。

内容的提问来源于stack exchange,提问作者Melissa Flassig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 03:07:18