【问题标题】:Marklogic - get list of all unique document structures in a Marklogic databaseMarklogic - 获取 Marklogic 数据库中所有唯一文档结构的列表
【发布时间】:2016-10-27 03:40:47
【问题描述】:

我想获取 Marklogic 数据库中所有不同文档结构的列表。

例如包含这 3 个文档的数据库:

1) 罗伯特
2) 标记
3) 罗伯特史密斯

将返回数据库中有两个唯一的文档结构,一个由 2 个文档使用,另一个由 1 个文档使用。

我正在使用这个 xquery 并且正在正确地取回唯一的元素序列列表:

for $i in distinct-values(for $document in doc()
return <div>{distinct-values(
for $element in $document//*/*/name() return   <div>{$element}</div>)}   </div>)
return $i

我很欣赏这段代码不会处理重复的元素名称,但现在还可以。

我的问题是:

1) 有没有更好/更有效的方法来做到这一点?我假设是的。
2) 有没有办法取回足够的细节,以便我可以建立每个独特结构的 xml 树?
3)返回每个不同结构的计数的最佳方法是什么,例如2和1以及上面的例子中

【问题讨论】:

  • 如果有人提供了足够的解决方案,请将答案标记为已接受。否则,请详细说明问题,以便其他人提供帮助。

标签: xpath xquery marklogic


【解决方案1】:

如果您需要执行此操作的元素列表有限,请考虑同时出现或其他类似的解决方案:https://docs.marklogic.com/cts:value-co-occurrences

这需要每个相关元素的范围索引。

MarkLogic 尽可能地使用索引。我能想到的另一个解决方案是,您实际上为每个相关文档的目标内容的值创建一个哈希/校验和,并将其与文档一起存储(或者如果您碰巧拥有语义许可,则存储在三元组中)。那么你就已经有一把钥匙了 独特的组合。

【讨论】:

  • 在我看来,OP 正在寻找独特的文档结构,而忽略了值。
  • 正确。我不关心元素值,只关心结构。
【解决方案2】:

1) 有没有更好/更有效的方法来做到这一点?我假设是的。

如果由我决定,我会以一致的方式创建文档(就像您正在做的那样),然后对其进行散列,并将散列作为集合附加到每个文档。然后我可以计算每个集合中的文档。如果不先写入文档内容或元数据(集合是一种元数据)然后查询索引,我看不到任何有效的方法(使用索引)来获取计数。

2) 有没有办法获取足够的细节,以便我可以构建每个独特结构的 xml 树?

获得每个集合的计数后,您可以从每个集合中检索一个文档并遍历它以构建一个空的 XML 结构。如果您已经了解 XSLT,XSLT 可能是一个很好的方法。

3) 返回每个不同结构的计数的最佳方法是什么,例如2和1以及上面的例子中

打开数据库上的集合词典。然后执行以下操作:

对于 cts 中的 $collection:collections() return ($collection, cts:frequency($collection))

【讨论】:

  • 谢谢,哈希/集合非常适合获取计数和(更)更有效地检查数据库中的唯一 xml 结构。
【解决方案3】:

不确定我是否完全符合您的要求,但我想知道这是否更符合您的要求-functx:distinct-element-paths($doc)

http://www.xqueryfunctions.com/xq/functx_distinct-element-paths.html

这是一个简单的例子:

xquery version "1.0-ml";
import module namespace functx = "http://www.functx.com" at "/MarkLogic/functx/functx-1.0-nodoc-2007-01.xqy";

let $doc := <document><fname>Robert</fname><lname>Smith</lname></document>

return 
    functx:distinct-element-paths($doc)

输出以下字符串(当然可以解析):

document
document/fname
document/lname

【讨论】:

    【解决方案4】:

    现有的第 3 方工具可能会起作用,具体取决于数据的大小和所需的覆盖范围(需要 100% 抽样)。 搜索“从 XML 生成模式”—— 此类工具将查看样本集并推断模式(xsd、dtd、rng 等)。 他们做得很准确,但并不总是像人类一样。 如果他们没有本地 ML 集成,那么您需要公开服务或导出数据以进行分析。

    一旦你有了一个模式,将它加载到 MarkLogic 中,你就可以在 ML 中以编程方式直接查询模式(以及由它验证的元素) 如果您发现在 XSLT、XQuery 或 JavaScript 中实现的“生成模式”工具,您可以将其导入并在服务器中执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2023-03-13
      • 1970-01-01
      • 2016-12-11
      相关资源
      最近更新 更多