【问题标题】:Replacement for descendant-or-self in XPath/XQuery在 XPath/XQuery 中替换后代或自我
【发布时间】:2014-05-26 16:07:38
【问题描述】:

我正在寻找 XPath/XQuery 中 descendant-or-self 的替代品。我们使用 XQuery 来查询 MarkLogic DB。我想要替换 descendant-or-self 的原因是我试图将 50 个值与 XML 结构中的属性值进行匹配。 XML 说它有超过 100 万个节点,所以我必须每次做 100 万次后裔或自我来找到精确匹配的节点,这是非常昂贵的操作。下面给出了基本的 XML 层次结构

A (@val=1) -> B (@Val="2") -> C (@val="3") -> A -> A -> A -> A(不定)

上面我正在尝试匹配每个节点中的val 属性以找到确切的节点。由于A 节点在C 之后出现在不同级别,我无法使用任何MarkLogic API 来找到精确匹配的节点,因为我不知道它在XML 中的哪个级别匹配。 (假设分片在B级完成)

【问题讨论】:

  • 请提供速度慢的 XPath。
  • 这是您当前的 XPath:A[@val=1]/B[@Val="2"]/C[val="3"]//A 吗?
  • 你说 XML 说它有超过 100 万个节点,所以我不得不做一百万次后裔或自我操作——这是一个了不起的不合逻辑的说法。你能解释一下吗?

标签: xpath xquery marklogic


【解决方案1】:

问题可能是碎片和 XML 结构,而不是后代或自我轴本身。在 XPath 中跨越片段边界是有成本的,即使是很小的成本也会很快增加一百万个片段。如果您将文档视为行而不是表格,则 MarkLogic 效果最佳。

在您做任何其他事情之前,我建议您对慢速查询进行分析。在评估您的 XPath 之后,从 xdmp:query-meters() 获取输出。这将告诉您 XPath 必须遍历多少片段。

一旦您确认它是碎片化的,就有多种选择。您可以尝试将根级 A 元素重命名为其他名称,以便 //A 与根不匹配。这样,XPath 就不必跨越片段边界。但是,当其他 XPath 越过该片段边界时,您仍然可能会遇到问题。

我首选的解决方案是拆分文档,以便拥有一百万个 B 文档,而不是单个 A 和一百万个 B 子片段。根 A 级别的任何信息都必须在每个 B 根中复制,或者可能移动到已知 URI 处的小型清单文档中。

我认为这是我在没有看到内容或者听到一些用户故事的情况下所能获得的最具体的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    相关资源
    最近更新 更多