Nano Hash - криптовалюты, майнинг, программирование

Странное поведение при применении fn:data к инфоузлу

Когда я запускаю следующий xquery в MarkLogic:

xquery version "1.0-ml";

let $envelope := <envelope xmlns="http://marklogic.com/entity-services"> 
                                <info>hello</info>
                             </envelope>

return fn:data($envelope/es:info)

Я получаю эту ошибку:

[1.0-ml] XDMP-NONMIXEDCOMPLEXCONT: fn:data(hello) -- Узел имеет сложный тип с несмешанным сложным содержимым

Как ни странно, когда я переименовываю информационный узел, например, в info1, код работает так, как ожидалось:

xquery version "1.0-ml";

let $envelope := <envelope xmlns="http://marklogic.com/entity-services">
                         <info1>hello</info1>
                     </envelope>

return fn:data($envelope/es:info1)

результат: привет (как и ожидалось)

Кто-нибудь может объяснить мне эту черную магию?

02.01.2019

Ответы:


1

MarkLogic пытается получить типизированное значение из ваших данных при использовании fn:data(). MarkLogic будет искать подходящую схему для этой цели. Поскольку вы используете пространство имен entity-services, оно будет искать схему entity-services. Эта схема имеет конкретное определение элемента info (как правильно упомянул Майкл), которое не соответствует тому, как вы его используете.

Использование fn:string() вместо fn:data() обычно более надежно, так как не будет проверяться тип данных. Использование имени элемента, которое не определено в схеме entity-services, дает вам быстрое исправление, которое будет работать сейчас, но может быть сложно гарантировать, что оно будет работать и в будущем.

Лично я бы посоветовал использовать пространство имен entity-services по назначению. Если вам нужно добавить дополнительные элементы, поместите их в другое пространство имен, с сопровождающей схемой или без нее. Или просто полностью удалите пространство имен.

ХТХ!

07.01.2019
  • Спасибо за это объяснение! Из документации marklogic не было ясно, что fn:data() действительно ищет схемы. И на самом деле мы использовали xdmp:hash64(), который использует fn:data под водой, поэтому в нашем случае решением было использовать fn:string(xdmp:hash64($variable)) 08.01.2019

  • 2

    Я предполагаю, что это потому, что схема entity-type.xsd определяет элементы как несмешанные:

    <xs:complexType name="InfoType">
        <xs:sequence>
          <xs:element ref="es:title"/>
          <xs:element ref="es:version"/>
          <xs:element ref="es:base-uri" minOccurs="0"/>
          <xs:element ref="es:description" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    
    <xs:element name="info" type="es:InfoType"/>
    

    Элемент может иметь смешанное содержимое, если он имеет атрибут mixed="true". Поскольку в этом случае вы не можете изменить схему, я бы попробовал использовать string().

    declare namespace es = "http://marklogic.com/entity-services";
    
    let $envelope := <envelope xmlns="http://marklogic.com/entity-services"> 
                        <info>
                          <title>hello</title>
                          <version>1.0</version>
                        </info>
                     </envelope>
    
    return $envelope/es:info/string()
    

    Это дает вам hello1.0 в результате, если это то, что вы хотели.

    Ваш пример с info1 работает, потому что этот элемент не определен в схеме (и, следовательно, не будет допустимым xml).

    02.01.2019

    3

    Поскольку функция fn:data() может взаимодействовать со схемами, рассмотрите возможность использования fn:string() для получения текста элемента в виде строки.

    02.01.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..