我在 MarkLogic 服务器中创建了一个数据库,并为同一数据库附加了一个林。如何识别 Marklogic 数据库中的重复文档?
例如,我在 URI 中有 C.xml /A/B/c.xml
,/D/E/c.xml
两者都是相同的森林和相同的数据库。如何确定 c.xml 是否重复?
我在 MarkLogic 服务器中创建了一个数据库,并为同一数据库附加了一个林。如何识别 Marklogic 数据库中的重复文档?
例如,我在 URI 中有 C.xml /A/B/c.xml
,/D/E/c.xml
两者都是相同的森林和相同的数据库。如何确定 c.xml 是否重复?
为了比较两个文档并确定它们是否重复(加载了不同 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)
没有“两个文件”是“相同的”。时期。因此,没有重复的文件。问题解决了。
这导致答案取决于“重复”的定义。如果您的意思是“具有相同的语义数据内容”,那么 deep-equal 方法将适用于 xml 文件,但如果您打算将非语义差异视为属性之间的额外空格、属性排序、命名空间前缀等,则会失败。如果您的意思是“相同的内容和相同的属性、权限、集合等”,则需要额外检查。
如果你知道 GIT 是如何工作的,那是一个很好的心智模型。您可以使用 2 个具有相同内容的文件,但这并不意味着它们是“重复的”——
一个更微妙的问题是,如果你的意思是 2 个具有相同 URI 的文档——这可以如果你乱搞森林,就会发生。创建 2 个数据库,将 /a.xml 放入每个数据库中,然后从一个数据库中分离森林并将其附加到另一个数据库 - 现在您可以拥有 2 个具有相同 URI 的文档(具有相同或不同的内容)。不要那样做。对于非 xml 文档(或 xml 文档),您可以比较文本序列化格式——我建议您在所有文档上计算一个哈希(如 md5)——然后您可以比较哈希以查看文档是否*有相同的规范化文本内容”(与“重复”不同)