如何在导入时使用 BlastXML2 命名空间?

问题描述 投票:0回答:1

Xquery 架构如下所示:https://www.ncbi.nlm.nih.gov/data_specs/schema_alt/NCBI_BlastOutput2.xsd(Blast+ 命令行上的 Outfmt = 16)。

目标是:

  • 包含搜索词(目前只有一个,最好是一组中的任何一个)
  • 排除黑名单项目(同上)
  • 过滤高于特定阈值的比特分数。

到目前为止,我已经成功过滤了一个搜索词和一个黑名单项目。但我必须走一条非常奇怪的路才能到达那里。

在 .xml 文档中,它是一个简单的路径,例如

Hit/description/HitDescr/title
。你可以在下面看到,即使我取出一件物品,即使只有一件物品,我也必须重复使用
//*:title[1]
或你有什么。这意味着如果我想使用“搜索”而不是“点击”并想要提取 .csv 的查询名称,代码就会中断。

我收到一条错误消息,说标题应该是一个项目而不是一系列,但我已将

title
指定为
[1]
,这让我很头疼。如果数据库有多个 .xml,该错误也会得到位分数由于某种奇怪的原因将其归档。它适用于包含一个 .xml 文件的数据库。

declare namespace blast = "http://www.ncbi.nlm.nih.gov"
declare variable $searchTerm as xs:string external := "virus";
declare variable $blacklist as xs:string external := "Phage";
declare variable $bitscore as xs:int external := 50;


let $options := map { 
                     'format' : 'xquery',
                     'header': true(),
                     'separator': 'comma'
                     }  

let $hits := //*:Hit

let $hasParams := for $hit in $hits
                  where $hit//*:title[1][not(text() contains text {$blacklist})] and $hit//*:title[1][text() contains text {$searchTerm}] and $hit//*:bit-score[1][data() > $bitscore]
                  return $hit  

let $data := map { 
'names' : ['species name', 'bitscore'],
'records' : (for $entry in $hasParams
return[string($entry//*:title), string($entry//*:bit-score)]
)
}

return file:write(
  '/tmp/output.csv',
  csv:serialize($data, $options)
                 )

这工作正常,并构成了我之前使用 Python 构建 .csv 的基础(速度很慢,因为我一次要以这种方式处理整个 .xml 文件文件夹),这似乎是错误的。

xml xquery basex blast
1个回答
0
投票

我怀疑(但这有点猜测,因为你没有非常精确地描述问题)当你的意思是

$hit//*:title[1]
时,你犯了一个常见的错误,写了
($hit//*:title)[1]
。前一个表达式选择作为其父级的第一个子级标题的每个标题。

© www.soinside.com 2019 - 2024. All rights reserved.