Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath XQuery-优化低效查询策略(在现有数据库中)_Xpath_Xquery_Exist Db - Fatal编程技术网

Xpath XQuery-优化低效查询策略(在现有数据库中)

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 除其他外,这些主文档

环境: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>
这可以为单个表输出添加多达数百个往返行程

如有必要,我不反对将任务重组为多个职能


非常感谢。

请向我们提供输入xml和所需的输出,否则无法重写您的查询。我们还需要查看您的索引配置

一些避免往返的一般建议:

  • 首先,让我来回答你关于使用
    ft:query()
    。执行
    [@xml:id=$b/数据(@nymRef)]时,使用
    索引,还是强制它在没有索引的情况下进行字符串比较
    是否在该字符串上配置了索引

  • id()
    是查找
    xml:id
    值的最快方法

  • distinct value
    是您只查找每个distinct值的朋友吗 键:值对一次

  • 使用单个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>