xquery - 使用 xquery 和 FLWOR 在 BaseX 中迭代大型 XML 文档的最有效方法

标签 xquery basex flwor

我面临一个有趣的问题,我需要遍历多个大型 XML 文件(每个文件有数百 MB)并从每个元素输出特定数据,并尽快完成。 示例:

Points.xml:

<points>
  <point>
    <identifier>bb25c66c-27d0-447f-aaad-bd8290b332fd</identifier>
    <name>A</name>
  </point>
  <point>
    <identifier>f187cc74-2709-4464-995c-b3bdcae46b39</identifier>
    <name>B</name>
  </point>
</points>

路由.xml:

<routes>
  <route>
    <pointLink xlink:href="urn:uuid:bb25c66c-27d0-447f-aaad-bd8290b332fd"/>
    <name>1</name>
  </route>
  <route>
    <pointLink xlink:href="urn:uuid:f187cc74-2709-4464-995c-b3bdcae46b39"/>
    <name>2</name>
  </route>
</routes>

不同文档中有数以万计的点/路线元素,它们比这复杂得多,但对于这个例子,这段摘录就足够了。

输出需要是这样的:

1 - A
2 - B

我无法修改文档本身,这是我必须处理的,现在的问题是 - 如何尽可能有效地根据标识符链接元素?我正在谈论执行此操作的方法,也许是一种不同的思考方式,而不是实际的代码,因为无论如何最终都会有很大不同。

我尝试循环路线,然后使用 FLWOR 查找点:

for $route in doc('routes.xml')/routes/route
  return concat(
    $route/name/text(),
    ' - ',
    doc('points.xml')/points/point[./identifier/text() = substring-after($route/pointLink/@xlink:href, 'urn:uuid:')]/name/text()
  )

效果不太好(花了将近一个小时才完成)。这种方法也有类似的故事:

for $route in doc('routes.xml')/routes/route,
    $point in doc('points.xml')/points/point[./identifier/text() = substring-after($route/pointLink/@xlink:href, 'urn:uuid:')]
  return concat(
    $route/name/text(),
    ' - ',
    $point/name/text()
  )
最后,我需要在输出中使用来自点/路线的更多子元素,所以我想我必须用 for 迭代它们,然后连接输出,但也许我错了,这就是我的原因在这里提问。

是否有我忽略的事情,或者根本没有更快的方法来做到这一点?

最佳答案

正如 Martin Honnen 在评论中所说,问题确实出在索引上。 简单地创建属性索引(CREATE INDEX 属性)有助于将查询时间从约 45 分钟减少到不到一秒。难以置信。

关于xquery - 使用 xquery 和 FLWOR 在 BaseX 中迭代大型 XML 文档的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56666286/

相关文章:

SQL XML 选择 where 子句

sql - Xquery 获取连续的不同值

java - Java 中的 BaseX 数据库添加

xml - BaseX数据库: How to specify namespace context for query using xpath?

xml - 将元素序列转换为树

sql-server-2008-r2 - Sql server 中的 FLWOR 计数命中数

xml - 如何将一个 FLWOR 通过管道传输到另一个 FLWOR 中?

javascript - MarkLogic 8 和服务器端 JavaScript - 序列上的 XPath 查询

xml - xQuery 更改节点层次结构(从一个节点中删除子节点并将其作为兄弟节点返回)

xml - 如何使用Xquery和FLOWR来迭代并返回每个结果?