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 文件文件夹),这似乎是错误的。
我怀疑(但这有点猜测,因为你没有非常精确地描述问题)当你的意思是
$hit//*:title[1]
时,你犯了一个常见的错误,写了($hit//*:title)[1]
。前一个表达式选择作为其父级的第一个子级标题的每个标题。