我在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级完成)
答案 0 :(得分:5)
问题可能是碎片和XML结构,而不是后代或自身轴。 XPath中的跨越片段边界具有成本,即使很小的成本也会快速增加一百万个片段。如果您将文档视为行而不是表格,MarkLogic的效果最佳。
在你做任何其他事情之前,我建议对慢速查询进行分析。在评估XPath后获取xdmp:query-meters()
的输出。这将告诉你XPath必须遍历多少个片段。
一旦你确认它是碎片,有几种选择。您可以尝试将根级A
元素重命名为其他元素,以使//A
与根不匹配。这样XPath就不必跨越片段边界。但是,在其他一些XPath跨越该片段边界的任何时候,您仍可能遇到问题。
我首选的解决方案是拆分文档,以便您拥有一百万B
个文档,而不是一个A
,其中包含一百万B
个子片段。根A
级别的任何信息都必须在每个B
根中重复,或者可能移动到一个众所周知的URI的小型清单文档中。
我认为这是我能够在没有看到内容的情况下获得的具体内容,也许还会听到一些用户故事。