在XPath / XQuery中替换为descendant-or-self

时间:2014-05-26 16:07:38

标签: xpath xquery marklogic

我在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级完成)

1 个答案:

答案 0 :(得分:5)

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

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

一旦你确认它是碎片,有几种选择。您可以尝试将根级A元素重命名为其他元素,以使//A与根不匹配。这样XPath就不必跨越片段边界。但是,在其他一些XPath跨越该片段边界的任何时候,您仍可能遇到问题。

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

我认为这是我能够在没有看到内容的情况下获得的具体内容,也许还会听到一些用户故事。