我在MarkLogic服务器中创建了一个数据库,并为同一个数据库附加了一个林。如何识别Marklogic数据库中的重复文档?
例如,我在URI /A/B/c.xml
中有C.xml,而/D/E/c.xml
都是相同的林和相同的数据库。如何确定c.xml是否重复?
答案 0 :(得分:1)
为了比较两个文档并确定它们是否重复(加载了不同URI的相同文档),您可以使用fn:deep-equal()
函数。
例如:
let $doc1 := fn:doc("/A/B/c.xml")
let $doc2 := fn:doc("/D/E/c.xml")
return fn:deep-equal($doc1, $doc2)
答案 1 :(得分:0)
没有“两个文档”是“相同的”。期。因此,没有重复的文档。问题解决了。
这导致答案取决于“重复”的定义。如果您的意思是“具有相同的语义数据内容”,则深度相等方法将适用于xml文件,但是如果您打算考虑非语义差异(例如属性之间的多余空格,属性顺序,名称空间前缀等),则将失败。如果您的意思是“内容相同,属性,权限,集合等相同”,则需要进行其他检查。
如果您知道GIT的工作原理,那将是一个很好的心理模型。您可以2个内容相同的文件,但这并不意味着它们是“重复项”-
一个更微妙的问题是,如果您的意思是2个具有相同URI的文档-如果您在森林中乱堆,就会发生 。创建2个数据库,将/a.xml放在每个数据库中,然后将目录林与其中一个分离,然后将其附加到另一个数据库中-现在您可以拥有2个具有相同URI的文档(内容相同或不同)。不要那样做
对于非xml文档(或xml文档),您可以比较文本序列化格式-我建议您对所有文档进行计算的哈希(例如md5)-然后可以比较哈希值以查看文档*是否具有相同的标准化文本内容”(与“重复”完全不同)