Уточнение запроса MarkLogic

В MarkLogic, как я могу найти URI документа, где находится элемент

<sample-ref type="dated">

и соответствующее значение равно 1742

Вот пример XML-документа:

<samples>
  <sample>
    <sample-ref type="dated">1742</sample-ref>
    <sample-ref type="undated">1742</sample-ref>
    <sample-xref type="sub">
      <sample-ref type="dated">TT 1742</sample-ref>
    </sample-xref>
    <sample-xref type="din">
      <sample-ref type="dated">
      </sample-ref>
    </sample-xref>
    <sample-xref type="sup">
      <sample-ref type="dated">XX 1742</sample-ref>
    </sample-xref>
  </sample>
</samples>

Я только хочу запросить этот элемент, где значение соответствует 1742

<sample-ref type="dated">1742</sample-ref>

Я пробовал этот запрос, но он возвращает более одного uri:

cts.uris("", null, cts.elementValueQuery(xs.QName("sample-ref"), "1742", "exact"))

Как я могу уточнить этот запрос

Спасибо за вашу помощь


person subsoft    schedule 02.02.2018    source источник


Ответы (1)


Вы пытаетесь запросить документ, содержащий элемент sample-ref с текстовым содержимым "1742" и атрибутом type со значением "датировано". И, возможно, вы обнаружили, что следующее не работает:

cts.elementQuery(xs.QName('sample-ref'), cts.andQuery([
  cts.elementAttributeValueQuery(xs.QName('sample-ref'), xs.QName('type'), 'dated'),
  cts.elementValueQuery(xs.QName('sample-ref'), '1742')
]))

Потому что оказывается, что, кроме запросов атрибутов элемента, запросы element внутри запросов элементов соответствуют только потомкам, а не потомкам-или-я.

Одно из решений этой проблемы задокументировано Дэвидом Касселем в его сообщении в блоге здесь: http://blog.davidcassel.net/2012/08/a-trick-with-ctsnear-query/

Используя cts.nearQueries с расстоянием 0, он заставляет ML находить места, где подзапросы соответствуют одному и тому же элементу.

i.e.

cts.uris("", null, cts.nearQuery([
  cts.elementAttributeValueQuery(xs.QName('sample-ref'), xs.QName('type'), 'dated'),
  cts.elementValueQuery(xs.QName('sample-ref'), '1742')
], 0))

В сообщении блога упоминается, что для запуска этого индекса вам необходимо включить два индекса в вашей базе данных: element value positions и attribute value positions. Помимо прироста производительности, если вы используете почти-запрос в вызове cts.uris, это необязательно — cts.uris не будет «фильтровать» результаты переданного запроса, поэтому без этих индексов вы все равно получите ложные срабатывания.

person BenW    schedule 02.02.2018