我想获得一个包含Marklogic数据库中所有不同文档结构的列表。
e.g。包含这3个文档的数据库:
1)< document>< name> Robert< / name>< / document>
2)< document>< name>标记< / name>< / document>
3)< document>< fname> Robert< / fname>< lname> Smith< / lname>< / 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
我很欣赏这段代码不会处理重复的元素名称,但现在还可以。
我的问题是:
1)有更好/更有效的方法吗?我假设是的。
2)有没有办法获得足够的细节,以便我可以建立每个独特结构的xml树?
3)返回每个不同结构的计数的最佳方法是什么,例如2和1以及上面的例子
答案 0 :(得分:1)
如果你有一个有限的元素列表,你需要考虑共同出现或其他类似的解决方案:https://docs.marklogic.com/cts:value-co-occurrences
这需要对每个元素进行范围索引。
尽可能使用MarkLogic最好使用索引。我能想到的另一个解决方案是,您实际上为每个有问题的文档创建目标内容值的哈希/校验和,并将其与文档一起存储(如果您恰好拥有语义许可,则存储在三元组中)。然后你就已经拥有了一把钥匙 独特的组合。
答案 1 :(得分:0)
1)有更好/更有效的方法吗?我假设是的。
如果由我决定,我会以一致的方式创建文档(就像您正在做的那样),然后对其进行哈希处理,并将哈希作为集合附加到每个文档。然后我可以统计每个集合中的文档。我没有看到任何有效的方法(使用索引)来获取计数而没有先写入文档内容或元数据(集合是一种元数据),然后查询索引。
2)有没有办法获得足够的细节,以便我可以构建每个独特结构的xml树?
获得每个集合的计数后,您可以从每个集合中检索一个文档并遍历它以构建一个空的XML结构。如果你已经知道XSLT,XSLT可能是一个很好的方法。
3)返回每个不同结构的计数的最佳方法是什么? 2和1以及上面的例子
打开数据库上的收集词典。然后执行以下操作:
for cts中的$ collection:collections() return($ collection,cts:frequency($ collection))
答案 2 :(得分:0)
我不确定我是否完全遵循您的追求,但我想知道这是否更符合您的要求 - 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
答案 3 :(得分:0)
根据数据的大小和所需的覆盖范围(需要100%采样),存在可以使用的第三方工具。 搜索“从XML生成模式”- 这样的工具将查看样本集并推断出模式(xsd,dtd,rng等)。 他们做的很准确,但并不总是像人类那样。 如果他们没有本机ML集成,则需要公开服务或删除数据进行分析。
一旦拥有了架构,就将其加载到MarkLogic中,就可以在ML中以编程方式直接查询该架构(以及由其验证的元素) 如果您找到在XSLT,XQuery或JavaScript中实现的“生成架构”工具,则可以在服务器中导入并执行该工具。