Как идентифицировать дубликаты документов на сервере MarkLogic?

Я создал одну базу данных на сервере MarkLogic, а также прикрепил один лес для той же базы данных. Как определить дубликаты документов в базе данных Marklogic?

Например, у меня есть C.xml в URI /A/B/c.xml и /D/E/c.xml, это один и тот же лес и одна и та же база данных. Как я могу определить, является ли c.xml дубликатом или нет?


person Antony    schedule 02.03.2016    source источник
comment
Непонятно, что вы спрашиваете. MarkLogic не может иметь повторяющиеся URI. Они похожи на первичный ключ в реляционной базе данных. Не могли бы вы обновить свой вопрос, чтобы объяснить, в чем заключается ваш вопрос? Например, пытаетесь ли вы определить, как добавить контент и убедиться, что URI уникален (и не топтаться по записи), какую стратегию сначала проверить на существование URI и т. д.   -  person Mads Hansen    schedule 02.03.2016
comment
Уникальность URI управляется на уровне базы данных в подключенных в данный момент лесах. Если вы создадите URI X.json в базе данных A и URI X.json в отдельной базе данных B, а затем подключите леса из базы данных A и базы данных B к базе данных C, вы получите дубликат URI.   -  person Justin Makeig    schedule 02.03.2016
comment
Например, у меня есть C.xml в URI /A/B/c.xml и /D/E/c.xml, оба являются одним и тем же лесом и одной и той же базой данных. Теперь, пожалуйста, предложите мне, является ли c.xml дубликатом или нет?   -  person Antony    schedule 03.03.2016
comment
Не бывает двух одинаковых документов. период. Это приводит к тому, что ответ зависит от определения дубликата. Если вы имеете в виду одинаковое содержимое данных, метод глубокого равенства будет работать для файлов xml. Если вы имеете в виду тот же контент и те же свойства, разрешения, коллекции и т. д., это требует дополнительных проверок. Если вы знаете, как работает GIT, это хорошая ментальная модель. Вы можете создать 2 файла с одинаковым содержимым, но это не значит, что они дубликаты.   -  person DALDEI    schedule 23.10.2018


Ответы (2)


Чтобы сравнить два документа и определить, являются ли они дубликатами (одними и теми же документами, загруженными с разными 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)
person Mads Hansen    schedule 03.03.2016
comment
@ Энтони, похоже, это ответ на твой вопрос. Если да, не могли бы вы принять это, пожалуйста? (Это делает честь Мэдсу и говорит людям, которые ищут ответы на вопросы, что этот вопрос не нуждается в дополнительной помощи.) - person Dave Cassel; 05.01.2017

Нет «двух одинаковых документов». период. Поэтому дубликатов документов нет. Проблема решена.

Это приводит к тому, что ответ зависит от определения «дубликата». Если вы имеете в виду «имеет одинаковое семантическое содержимое данных», тогда метод глубокого равенства будет работать для файлов xml, но не сработает, если вы намерены учитывать несемантические различия, такие как дополнительные пробелы между атрибутами, порядок атрибутов, префиксы пространства имен и т. д. Если вы имеете в виду «тот же контент и те же свойства, разрешения, коллекции и т. д.», это требует дополнительных проверок.
Если вы знаете, как работает GIT, это хорошая мысленная модель. Вы можете использовать 2 файла с одинаковым содержимым, но это не означает, что они являются "дубликатами" --
Более тонкая проблема, если вы имеете в виду 2 документа с одним и тем же URI -- это может произойти если возиться с лесами. Создайте 2 базы данных, поместите /a.xml в каждую, затем отсоедините лес от одной и присоедините его к другой — теперь у вас может быть 2 документа (с одинаковым или разным содержимым) с одним и тем же URI. Не делай этого. Для не-xml-документов (или для xml-документов) вы можете сравнить текстовый сериализованный формат — я предлагаю хэш (например, md5), который вы вычисляете для всех документов — затем вы можете сравнить хэши, чтобы увидеть, имеют ли документы * тот же нормализованный текстовый контент» (не то же самое, что «дублировать»)

person DALDEI    schedule 23.10.2018