环境: 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这些主文档包含每个人或每个地方的规范名称。
我经常对某个名称进行单一查找,例如
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>任务是获取所有seg/@xml:id,然后查找并输出其下任何placeName/@nymRef的规范名称。这导致了大量的往返,效率非常低,但我不知道在eXist-DB中有任何其他方法可以做到这一点。昂贵的往返行程在let $c中表示,循环通过return
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>对于单个表输出,这可能会增加数百次往返。
如果有必要,我不反对将任务重组为多个功能。
在此之前,非常感谢您。
发布于 2018-11-02 19:51:25
请为我们提供输入xml和所需的输出,否则将无法重写查询。我们还需要查看您的索引配置。
一些一般性的建议,以避免往返:
ft:query()的使用问题。当使用索引查找存在时,或者您强制它进行字符串比较而没有在string?id()上配置索引时,valuesdistinct-values是可能的最快查找方法,它是您的朋友,只查找每个不同的键:值对一次。[@xml:id=$b/data(@nymRef)]循环来避免多次迭代相同的数据。//可能会将大量不必要的数据加载到内存中。所有这些甚至更多内容都可以在documentation中找到
https://stackoverflow.com/questions/53107767
复制相似问题