获取Marklogic数据库中所有唯一文档结构的列表



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

。包含以下3个文档的数据库:

1) & lt; document> & lt; name> Robert & lt;/document>
2) & lt; document> & lt; name> mark lt;/name> & lt;/document>
3) & lt;文档> & lt; fname>Robert & lt; lname> Smith & lt;/document>

将返回数据库中有两个唯一的文档结构,一个被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

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

我的问题是:

是否有更好/更有效的方法来做这件事?我想是的。
2)是否有一种方法可以获得足够的细节,以便我可以建立每个独特结构的xml树?
3)返回每个不同结构(例如2和1)的计数的最佳方法是什么?在上面的示例中

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

这需要对所讨论的每个元素进行范围索引。

MarkLogic在可能的情况下最好使用索引。我能想到的另一种解决方案是,实际上为每个文档的目标内容的值创建一个哈希/校验和,并将其存储在文档中(如果您碰巧有语义许可,则存储在三元组中)。那你你已经有钥匙了唯一的组合。

是否有更好/更有效的方法来做这件事?我想是的。

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

2)是否有一种方法可以获得足够的细节,以便我可以建立每个独特结构的xml树?

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

3)返回每个不同结构(例如2和1)的计数的最佳方法是什么?

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

for $collectionReturn ($collection, cts:frequency($collection))

不确定我是否完全遵循您的要求,但我想知道这是否更多的是您正在寻找的- 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

有现有的第三方工具可以工作,这取决于数据的大小,以及所需的覆盖率(是否需要100%抽样)。搜索"从XML生成模式"——这些工具将查看示例集并推断模式(xsd、dtd、rng等)。它们能准确地完成工作,但并不总是以与人类相同的方式。如果它们没有本机ML集成,那么您需要公开服务或导出数据以供分析。

一旦你有了一个模式,将它加载到MarkLogic中,你就可以在ML中直接和程序化地查询模式(和由它验证的元素)如果你找到了一个用XSLT、XQuery或JavaScript实现的"生成模式"工具,你可以在服务器中导入并执行它。

最新更新