Marklogic: поиск документов, содержащих элементы без определенного атрибута (может быть, несколько на документ) - PullRequest
0 голосов
/ 11 октября 2018

У меня есть некоторые данные, которые выглядят примерно так:

<wrapper>
  <inner a="1"/>
  <inner a="2" b="3"/>
</wrapper>

Атрибут b может присутствовать или не присутствовать в каждом внутреннем элементе.Моя цель - найти все документы, содержащие хотя бы один внутренний элемент, который не имеет атрибута b. *

Этот похожий вопрос предлагает ответ:

cts:not-query(cts:element-attribute-value-query(xs:QName('inner'), xs:QName('b'), '*', ("wildcarded"))))

но это не работает, потому что некоторые внутренние элементы в одном и том же документе могут иметь атрибут b, а не-запросы работают со всем фрагментом, поэтому смешанный случай, такой как в примере выше, возвращаться не будет.Включение в запрос элемента не помогает, и кажется, что cts: and-not-query ведет себя так же.

Я также пытался решить проблему с помощью функций совместного использования / значений, чтобы прочитатьЗначения соответствующих атрибутов а, но это также представляется невозможным.Это могло бы быть возможно с настройками близости при одновременных вызовах, за исключением отсутствия текста элемента, поэтому атрибут индексируется с теми же позициями слова.

Есть ли альтернативы тупому xpath?

//inner[@a and not(@b)]

1 Ответ

0 голосов
/ 11 октября 2018

Вы всегда можете сделать xpath более сложным, если простота не является вашей целью.Как насчет этого: (он более точно отвечает на точный вопрос о «возврате всех документов, которые содержат элементы« innner », которые не имеют атрибута @ b»

doc()[exists(//inner[not(@b)])]

Я не знаю, насколько это хорошооптимизировано - некоторые выражения xpath оптимизируются до эквивалентного cts: query, а некоторые нет.

Существует еще один «прием», связанный с объединением выражений cts, представленных в виде карт. Возьмите результаты двух поисков, используйте параметры, которыевернуть результаты в виде карты, затем вы можете использовать операции на этой странице https://developer.marklogic.com/blog/im-a-map для выполнения чрезвычайно эффективных операций над множествами (объединение, пересечение, разность и т. д.). При правильном построении эта техника может быть такой же быстрой, как и "нативная".'поиск cts --- поиск cts использует один и тот же общий метод для разрешения результатов.

...