пятница, 8 июля 2016 г.

Модуль Value Set Editor (редактор наборов значений) в составе clinFHIR

Перевод оригинальной статьи, опубликованной Дэвидом Хэйем 30 мая 2016 года в блоге Hay on FHIR

С недавних пор я достаточно много времени уделяю добавлению в ClinFHIR различных функций для работы с профилями. Хотя для работы с ними существует "официальный инструмент" (я имею ввиду Forge от Furore), на рынке все-же найдется ниша для маленького приложения, предназначенного специально для медиков и способного выполнять вполне ограниченный набор задач в этой области. (К тому же мое небольшое приложение имеет исключительно демонстрационную цель и не предназначается для выхода "в продакшн".)

Но, есть еще одно интересное направление в стандарте FHIR, которые мне не хотелось бы обойти и которое имеет прямое отношение к профилям - это создание и редактирование т.н. "наборов значений" (value sets).

Небольшое отступление: основной целью создания профилей является "адаптация" базовых ресурсов (core resources) для их применения в реальных условиях т.е. для решения конкретных кейсов. Адаптация базовых ресурсов выражается в создании новых "элементов" (полей) ресурса и исключения неиспользуемых. Бывает, что в процессе создания профиля требуется определить некоторый ограниченный набор значений (или набор кодов), которые может принимать заданный элемент ресурса. Для этих целей (т.е. для определения набора таких значений) используется механизм, названный "value set". Проблема заключается в том, что в настоящее время нет какого-либо доступного инструмента для создания наборов значений (кроме тех приложений и инструментов, которые используются непосредственно при разработке спецификации). Именно поэтому мне в голову пришла мысль разработать приложение, ValueSet Editor, т.е. редактор наборов значений.

Пояснение спецификации FHIR: Ресурс "ValueSet" (набор или подмножество значений) используется в стандарте FHIR для определения наборов кодов, в том числе извлеченных из одной или нескольких систем кодирования. Спецификация FHIR разделяет такие (ключевые) понятия, как code system (система кодирования) и value set (набор значений). Под системой кодирования (также используют термины "перечисление", "терминология", "классификация", "онтология") следует понимать набор кодов, где каждому коду сопоставлено отдельное значение. Под набором значений понимается выборка или подмножество кодов, извлеченный из одной или нескольких систем кодирования. Иначе говоря, коды с заданным символьным выражением и смыслом организуются в системы кодирования, а затем извлекаются из одной или нескольких систем и группируются (в наборы значений) для решения конкретных задач.

Наборы значений (ValueSet) могут быть двух типов:

  1. Система кодирования (т.е. набор кодов, объединенных по какому-либо принципу) может быть определена при создании набора и в полном объеме быть реализована в наборе значений (in-line);
  2. Набор значений может составляться из кодов, извлеченных из других систем кодирования, двумя способами: (1) простым перечислением кодов (in-line) или (2) заданием критериев выбора данных кодов. Простые наборы значений ("in-line", т.е. те, которые составляются простым перечислением кодов) используются в привязке к "простым справочникам", предназначенным для внутреннего использования. Такие справочники представляют собой простое (небольшое) перечисление допустимых значений, набор кодов состояний, списки слов и т.д. Инлайновые наборы значений не предназначены для работы с большими справочниками и терминологиями, поддержка которых осуществляется известными организациями (SNOMED, LOINC). Работа с такими справочниками возможна через наборы значений второго типа.
Набору значений соответствуют два URL - логический идентификатор и указатель на ресурс (локатор) - оба используемые в качестве ссылки на набор значений. Локатор ресурса - это URL-адрес, по которому может быть получен ресурс, чаще всего с FHIR-сервера. Иначе, локатор ресурса - это относительная ссылка на ValueSet-ресурс; ее разрешение происходит относительно сервера, на котором размещен ресурс. Логический идентификатор хранится в самом ресурсе, а именно в поле "ValueSet.ulr" и используется для ссылки на данный набор значений из любой системы.

Также как и возможности clinFHIR по созданию профилей, функционал ValueSet Editor очень ограничен. На настоящий момент некоторые функции ValueSet Editor замкнуты исключительно на SNOMED, хотя предназначаются для работы и с другими терминологиями, если их поддерживает выбранный терминологический сервер (terminology server). Новое приложение позволит создавать и редактировать наборы значений, правда, пока нет возможности редактировать чужие наборы значений, например, те, которые поставляются вместе с спецификацией, по вполне очевидным причинам. Однако, можно создавать их копии и редактировать для использования в рамках конкретного кейса.

Открыв страницу с приложением, выберем терминологический сервер (terminology server), на котором будем хранить создаваемые наборы значений. Терминологический сервер можно выбрать в панели меню в верхней части экрана. Приложение требует от сервера реализации ряда служб (определенных в STU-3), а именно:

(К слову сказать, на данный момент только сервер Грэма поддерживает третью версию стандарта HL7 в отношении терминологических сервисов (Наверное, речь идет о hl7 v3 core principles). Надеюсь, что и другие серверы скоро будут поддерживать v3!)

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

Чтобы просмотреть находящиеся на сервере наборы значений введем что-нибудь в поле поиска (например, "condition") и нажмем "find". Наборы значений, соответствующие введенному ключевому слову (поиск применяется к имени набора значений, а не к его содержимому), будут представлены пользователю в виде списка. Можно предварительно просмотреть (preview) набор значений (т.е. просмотреть json valueSet-ресурса) или сразу перейти к нужному набору значений (select). Во втором случае откроется редактор в режиме просмотра (view mode). Ниже показан список наборов значений в режиме поиска.

Редактор (Editor) - это основной инструмент для работы с наборами значений. Открыть редактор можно только после выбора или создания набора значений (иначе, для редактирования уже существующего набора).

В области слева размещаются 4 вкладки.

  • Вкладка "Contents" отображает концепции, включенные в выбранный набор значений. Value Set Editor поддерживает работу с 2-мя типами наборов значений: (1) перечислением концепций и (2) наборами значений, определенными фильтром, который выбирает из справочника (в нашем случае SNOMED) концепции, связанные отношением "является" ("is-a").
  • Вкладка "Description" содержит описание набора значений (краткое описание, требования, информацию о его создателе и т.д.). Эту информацию можно изменить при создании нового или производного набора значений. Во всех иных случаях данная информация предназначается только для чтения.
  • Вкладка "Expansion" позволяет выполнять развертку набора значений (ту же операцию позволяет выполнять и Resource Builder). В поле поиска вводятся ключевые слова, по которым терминологический сервер фильтрует "развертку" набора значений, т.е. отображает только концепции, соответствующие введенным поисковым критериям.
  • Вкладка "JSON" отображает json-код ValueSet-ресурса (по сути выполняет функцию, аналогичную "preview" при поиске).

Небольшое пояснение: Развертка набора значений "превращает" ValueSet-ресурс в простую коллекцию пронумерованных кодов, используемых при вводе данных или для валидации значений элементов ресурсов.

Описать процесс развёртывания набора значений (Value Set Expansion) можно следующим образом: приложение, поддерживающее стандарт FHIR, опрашивает терминологический сервер о конкретном наборе значений, сервер возвращает список кодов, входящих в заданный набор значений. Данный процесс называется именно развёртыванием, потому что входящие в набор коды, могут быть определены через описание критериев, по которым они извлекаются из заданных справочников и включаются в набор значений. Применение фильтра (т.е. выполнение описанных критериев отбора) по отношению ко всем кодам справочников и формирование из них некоторого подмножества и есть "развертывание набора значений". Иногда, если в запрашиваемый набор значений входит слишком большое кол-во кодов, сервер может возвращать код ошибки "too-costly" (операция требует слишком много ресурсов сервера).

Последнее, что еще хочется отметить: развертка может выполняться с применением фильтра, т.е. на список кодов, полученный в результате развертки, накладывается дополнительный фильтр. Развертка выполняется над набором значений, хранящимся на терминологическом сервере, поэтому, при внесении каких-либо изменений, следует их обязательно сохранять!

А теперь небольшой скриншот (сконцентрируем внимание на вкладках "contents", "description", "expansion", "json"):

На скриншоте показан созданный мною тестовый набор значений, содержащий три простые концепции (specified concept) и одну концепцию, заимствованную из справочника и имеющую связь "является" ("is-a").

Область справа (на скриншоте она была незаполненной) используется для добавления концепций в наборы значений, доступные для обновления. Давайте этим сейчас и займемся. Добавление концепций возможно двумя способами: (1) можно создать копию существующего набора значений или (2) создать новый набор значений "с нуля". Функция создания копии набора значений достаточно удобна, однако, что ClinFHIR слишком простое приложение, которое не может редактировать сложные наборы значений. Можно просмотреть json сложных ValueSet-ресурсов, они также будут работать в Value Set Editor (например, можно будет выполнять развертку), однако возможность по внесению изменений будет ограничена.

Создать копию или новый экземпляра ValueSet-ресурса можно нажатием на соответствующие кнопки в панели меню справа вверху.

  • На главной странице приложения (в этой области) размещается кнопка "new".
  • Кнопка "copy" появляется при просмотре уже существующего на сервере набора значений.

В любом случае (как при создании "с нуля", так и при работе с копией ресурса) потребуется ввести новое имя. Присвоенное имя должно быть уникальным в рамках данного терминологического сервера; оно также будет использоваться в качестве id ValueSet-ресурса. Введите имя ресурса в появившееся диалоговое окно, а затем нажмите кнопку "Check". Если введенное имя будет уникальным для данного сервера, появится кнопка "Select", иначе будет сообщено об ошибке и потребуется ввести другое имя.

Выбрав валидное имя для нового набора значений, вы будете возвращены в редактор, где в правой части появится панель "Add concept" (область справа специально предназначена для добавления концепций в набор значений).

Существуют два способа добавить новую концепцию в набор значений и 2 роли, которые могут выполнять концепции (все это описано выше).

  • Как уже говорилось в пояснении, концепция может быть отражена в простом перечислении кодов (наборе значений). Resource Builder использует наборы значений для выбора подходящего (допустимого) значения конкретного элемента ресурса.
  • Второй вариант: концепция описывает "фильтр" для некоторого справочника. Как правило, данная концепция связана с другими концепциями из справочника отношением "является" ("is-a"). (Иными словами, концепция описывает целую группу родственных концепций.) Поэтому, при развертке пользователь или машина получат список кодов, в который войдет как концепция-родитель (то есть "описывающая группу родственных концепций"), так и ее потомки (все или часть) в заданном справочнике (та самая группа концепций).
Чтобы выбрать концепцию можно воспользоваться вкладками "select from binding" или "enter directly". "Select the binding" имеет аналог и в Resource Builder: сервер выполнит поиск концепций, соответствующих критериям поиска, предварительно выполнив развертку набора значений.

Из списка концепций, которые я добавил в мой набор значений, я выбрал "Asthma finding (finding)" (то есть "is-a included concept" или "концепцию-фильтр", как мы определили выше):

Гораздо интереснее дело обстоит со второй вкладкой. В данной вкладке можно вводить код напрямую (если выбрать концепцию в первой вкладке, то поля в этой вкладке уже будут автоматически заполнены), но, кроме информации о выбранной концепции данная вкладка также сообщит о ее потомках и родителях. Можно передвигаться как по родительским концепциям, так и по потомкам (простым кликом), просматривая их взаимосвязи с другими концепциями и структуру иерархии. На скриншоте ниже показаны поля второй вкладки после автозаполнения (в первой вкладке в поле мы определили значение "pneumonia").
Чтобы добавить выбранную концепцию в набор значений, нажмите на кнопку "Add" или “Add as ‘is-a' ”. Разница между этими кнопками заключается в следующем:
  • Кнопка "Add" позволяет добавить только одну концепцию. В таком случае, если набор значений был изначально пуст, то он будет содержать (теперь) только одно значение.
  • Кнопка “Add as ‘is-a' ” добавит концепцию-фильтра (то есть, по сути целую группу концепций, связанных с данной концепцией связью типа "as is"). В моем примере концепция "абсцесс легкого с пневмонией " (Abscess of lung with pneumonia) будет включена в набор, т.к. она является потомком "pneumonia", а саму концепцию pneumonia мы добавили как "фильтр".
На скриншоте также ясно видно, что (по крайней мере, в SNOMED) одна концепция может быть потомком нескольких "родителей" (SNOMED поддерживает сетевую модель отношений для входящих в нее концепций). Т.е. концепции SNOMED связаны отношением "is-a" ("является") сразу с несколькими концепциями.

Некоторые замечания:

  • Приложение автоматически маркирует создаваемые в нем наборы значений меткой "clinfhir" (отмеченные наборы значений можно редактировать).
  • Когда речь идет о "концепциях-фильтрах" (может быть, не совсем корректно мы определили этот тип концепции в русском переводе, но "пусть будет так"), помните, что поиск среди потомков осуществляется по имени концепции. Используйте ключевые слова, в смысловом отношении связанные с концепцией-фильтром (то есть с родительской концепцией). По умолчанию в качестве поискового термина будет использоваться имя, присвоенное набору значений при его создании (оно также используется в качестве идентификатора valueSet-ресурса на сервере).
  • Иногда вместо имени сервера редактор может показывать "undefined". Хотя в этом случае редактор будет работать нормально, для исправления проблемы можно запустить Resource Builder и сбросить настройки конфигурации (выбрать "reset config" в меню в верхнем правом углу). При повторном запуске ValueSet Editor имя сервера будет определено как "Grahames Server".
  • При создании набора значений (ValueSet) "с нуля", лучше перезагрузить приложение, чтобы "обнулить" все внутренние переменные.
  • Периодически сервер Грэма сообщает о проблеме с базой данных ("deadlock"), поэтому, если такая проблема возникнет и у вас, просто повторите выполненные действия.
  • При поиске концепции по имени (также как и в Resource Builder) приложение использует в качестве базового набор значений http://hl7.org/fhir/ValueSet/condition-cause т.к. как он является ссылкой на все коды номенклатуры SNOMED. Это временно и скоро появится возможность задавать "корневую концепцию" (root concept) для поиска по ограниченному набору концепций.




Комментариев нет:

Отправить комментарий