Xpath XQuery-优化低效查询策略(在现有数据库中)
环境:eXist DB 4.4/Xquery 3.1 我有数百个tei:xml文档,其中编码了命名实体Xpath XQuery-优化低效查询策略(在现有数据库中),xpath,xquery,exist-db,Xpath,Xquery,Exist Db,环境:eXist DB 4.4/Xquery 3.1 我有数百个tei:xml文档,其中编码了命名实体persName和placeName。文件都在里面 collection("db/fooapp/data") persName和placeName的每个实例都有一个属性@nymRef,该属性包含一个值,该值引用主文档中的xml:id: db/fooapp/data/codes_persons.xml db/fooapp/data/codes_places.xml 除其他外,这些主文档
persName
和placeName
。文件都在里面
collection("db/fooapp/data")
persName
和placeName
的每个实例都有一个属性@nymRef
,该属性包含一个值,该值引用主文档中的xml:id
:
db/fooapp/data/codes_persons.xml
db/fooapp/data/codes_places.xml
除其他外,这些主文档包含每个人或地方的规范名称
例如,我经常对某个名字进行单一查找
let $x := some @nymRef
let $y := doc(db/fooapp/data/codes_places.xml)//tei:place[@xml:id=$x]//tei:placeName/text()
return $y
但是,有时我需要这样做,在巨大的列表中循环。例如,在所有文档中,我需要为seg
输出一个id
,并且它有一个(或多个)子元素placeName/@nymRef
:
<seg xml:id="fooref">some text<placeName nymRef="fooplace"/>some text</seg>
这可以为单个表输出添加多达数百个往返行程
如有必要,我不反对将任务重组为多个职能
非常感谢。请向我们提供输入xml和所需的输出,否则无法重写您的查询。我们还需要查看您的索引配置 一些避免往返的一般建议:
- 首先,让我来回答你关于使用
。执行ft:query()
[@xml:id=$b/数据(@nymRef)]时,使用 索引,还是强制它在没有索引的情况下进行字符串比较 是否在该字符串上配置了索引
是查找id()
值的最快方法xml:id
是您只查找每个distinct值的朋友吗 键:值对一次distinct value
- 使用单个for循环可避免对同一数据进行多次迭代 时代
- 尽可能使用限制性更强的XPath表达式,
可能会将大量不必要的数据加载到内存中/
所有这些以及更多信息都可以在中找到,谢谢这些提示。索引确实解决了很多问题,因此我不能真正抱怨速度。即使是我最糟糕的公式化查询现在也运行在0.5秒以下。所以这实际上是学习最佳实践<代码>不同的值将非常有用。挑战在于准确地学习如何将多个for循环减少为一个,我仍处于学习XQuery的早期阶段。再次感谢。
let $coll := collection("db/fooapp/data")
for $a in $coll//seg
for $b in $a//placeName
let $c := $doc("db/fooapp/data/codes_places.xml")//tei:place[@xml:id=$b/data(@nymRef)]//tei:placeName/text()
return
<tr>
<td>{$a/@xml:id}</td>
<td>{$c}</td>
</tr>