gpt4 book ai didi

xquery - Marklogic xquery 和有效循环子元素

转载 作者:行者123 更新时间:2023-12-02 08:10:07 25 4
gpt4 key购买 nike

想象一下,如果我有一个以下格式存储在 Marklogic 中的 xml 文档:

<document>
<id>DocumentID</id>
<questions>
<question_item>
<question>question1</question>
<answer>answer1</answer>
</question_item>
<question_item>
<important>high</important>
<question>question2</question>
<answer>answer2</answer2>
<question_item>
</document>

基本上,每个文档都有很多问题,只有其中一些有一个元素。我想以平面格式返回所有“重要”问题,并使用从文档中获取的元数据(例如 id)。

以下 xquery 似乎可以工作,并且速度相当快:

for $x in cts:search(/document,
cts:element-query(xs:QName("important"),cts:and-query((
))
), "unfiltered" , 0.0)
return for $y in $x/questions/question_item

return
if ($y/important) then
fn:concat($x/id,'|',
$y/question,'|',
$y/answer,
$y/important
)
else ()

这似乎有效并且相当快。然而,我通常发现 for 循环并不是 xquery 中最快的工作方式。该解决方案确实看起来是一个相对麻烦的方法。有没有更好的方法最初只返回“重要”节点,但随后仍然可以访问主文档元素?

最佳答案

就我个人而言,我发现条件逻辑比 for 循环更麻烦,但我认为您可以删除其中每个条件逻辑以获得更简单的查询。您可以简单地将它们分配给一个变量,这样您就可以引用它们,而不是循环遍历第一个文档序列。然后在循环中,使用谓词将 question_item 限制为具有 important 元素的元素,从而消除对条件的需要:

let $documents := cts:search(/document,
cts:element-query(xs:QName("important"), cts:and-query(())
), "unfiltered" , 0.0)
for $y in $documents/questions/question_item[important]
return fn:concat($x/id,'|',
$y/question,'|',
$y/answer,
$y/important)

关于xquery - Marklogic xquery 和有效循环子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41371117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com