FTR (терминологический репозиторий FHIR) — это открытая спецификация для структуры репозитория, форматов и алгоритмов для распространения терминологий FHIR в виде наборов значений.
Базовой единицей распространения является файл терминологии, который содержит расширенный набор значений и системы кодирования, используемые для развёртки этого набора значений. Развёрнутый набор значений представляет собой коллекцию всех понятий (концептов), на которые ссылается этот набор значений. Каждый концепт должен иметь как минимум два элемента — систему и код, а также может содержать и другие произвольные свойства.
Создание наборов значений выходит за рамки этой спецификации.
FTR определяет следующие сущности:
Можно сохранить полученный FTR в S3-подобное хранилище или в обычной файловой системе. FTR наполняется и распространяется через zen-пакеты.
Структура репозитория
FTR — это обычный каталог, содержащий каталоги модулей (fhir.r4 или loinc). Каталог каждого модуля содержит каталог vs/ с наборами значений и каталог tags/ с индексами тегов.
fhir/ # module
- tags/ # tags
- r5.ndjson.gz # tag indexes
- r4.ndjson.gz
- vs/
- patient.gender/ # valueset
- tag.r4.ndjson.gz # vs tag
- tag.r5.ndjson.gz
- tf.bc7623b7a94ed3d8feaffaf7580df3eca4f5f5ca.ndjson.gz # vs file
- tf.e3b0c44298fc1c149afbf4c8996fb92427ae41ca.ndjson.gz
- patch.bc7623b7a.7ae41ca.ndjson.gz # vs patch
loinc
- tags/
- main.ndjson.gz
- vs/
- loinc/
- tag.main.ndjson.gz
- tf.bc7623b7a94ed3d8feaffaf7580df3eca4f5f5ca.ndjson.gzФайл терминологии (TF) Файл терминологии (TF) представляет собой сжатый gzip-файл ndjson. Первые строки этого файла — это ресурсы CodeSystems и ValueSet, а остальные — это ресурсы Concept. Строки ресурса Concept должны быть отсортированы лексикографически по шаблону {{system}}-{{code}}. JSON должен быть в каноническом формате JSON, то есть с отсортированными ключами и без пробелов, чтобы гарантировать воспроизводимый хэш SHA256 файлов с одинаковым содержимым. Имя файла терминологии должно соответствовать шаблону vs.{hash}.ndjson.gz, где хеш — это хэш SHA256 сжатого gzip содержимого файла.
Файл исправления терминологии (TFP) и алгоритм сравнения Алгоритм сравнения Если у вас есть две версии файлов терминологии, вы можете сгенерировать файл исправления (TFP) за один прогон по следующему алгоритму:
reserve_lines_with_codesystems_and_valueset()
loop( c1 = next_concept(tf1), c2 = next_concept(tf2))
case
when is-nil(c1) && is-nil?(c2)
result
when is-nil(c1)
new_concept(c2)
recur(c1, next_concept(tf2))
when is-nil(c2)
remove_concept(c1)
recur(next_concept(tf1), nil)
when c1.code&system = c2.code&system
when c1 not equal c2
update_concept(c2)
recur(next_concept(tf1), next_concept(tf2))
when c1.code&system < c2.code&system
remove_concept(c1)
recur(next_concept(tf1), c2)
when c1.code&system > c2.code&system
new_concept(c2)
recur(c1, next_concept(tf2))
c1.code&system < c2.code&system and c1.code&system > c2.code&system означает, что вы должны сравнивать эти строки лексикографически.
Файл исправления терминологии Файл исправлений терминологии (TPF) представляет собой сжатый gzip ndjson-файл. Первая строка этого файла представляет собой объект JSON, содержащий имя ValueSet, для которого был создан этот файл исправления, а остальные — объекты JSON с операциями, описывающими, как получить новую версию файла терминологии и содержимое ресурса Concept.
TPF содержит всего 3 типа операций:
Пример файла исправления терминологии
{"name":"myvs"}
{"op": "add", "code":"c1", "display":".."}
{"op": "remove", "code":"c2", "display":".."}
{"op": "update", "code":"c3", "display":".."}Файл тегов ValueSet (VST) Файл тега ValueSet представляет собой файл ndjson, сжатый gzip. Где первая строка — это хэш последней версии ValueSet, а остальные — указатели на файлы патчей. Он используется для расчета эффективного исправления между несмежными версиями.
{"tag":"fhir.v4", "hash":"{hash-3}"}
{"from": "{hash-1}", "to":"{hash-2}"}
{"from": "{hash-2}", "to":"{hash-3}"}Файл индекса тегов (TI) Файл индекса тегов представляет собой таблицу всех наборов значений с определенным тегом и их фактических хэшей, отсортированных по имени набора значений. Он предназначен для быстрой проверки того, не изменилось ли что-либо в теге, и расчета плана массовых исправлений. Клиент может сохранить индекс последнего тега. Когда клиент хочет проверить, что «что-то изменилось», он может сравнить сохраненный индекс тега с текущим индексом тега. Когда индексы тегов не равны, клиент может загрузить файл индекса и, используя предыдущие хэши VS, определить, какой VS следует обновить. Чтобы обновить клиент VS, загрузите VST и выполните поиск исправлений, которые будут применяться к клиентской версии VS, или клиент может просто загрузить полную версию, указанную в VST.
Пример файла индекса тегов
{"name": "module.myvs-1", "hash":"...."}
{"name": "module.myvs-2", "hash":"...."}Алгоритм обновления файла терминологии
Алгоритм синхронизации тегов
Алгоритм публикации файлов терминологии
Для того, чтобы опубликовать файл терминологии под определенным тегом, выполните следующее:
Необходимо скачать файл zen.jar по ссылке https://github.com/HealthSamurai/ftr/releases/latest/download/zen.jar
Создайте директорию project со следующей структурой:
project/
zen-package.edn #Package deps declaration
resources/
icd-10.csv #CSV source file
zrc/
system.edn #System entrypoint importing a ValueSet definion
diagnosis.edn # ValueSet definition
Содержимое файла zen-package.edn:
{:deps {}}
Содержимое файла zrc/system.edn:
{:ns system
:import #{aidbox diagnosis}
box
{:zen/tags #{aidbox/system}}}
Содержимое файла zrc/diagnosis.edn:
{:ns diagnosis
:import #{zen.fhir}
diagnosis-vs
{:zen/tags #{zen.fhir/value-set},
:zen.fhir/version "0.5.0",
:uri "diagnosis-vs",
:ftr
{:module "ig",
:source-url "resources/icd-10.csv",
:ftr-path "ftr",
:tag "v1",
:source-type :flat-table,
:extractor-options
{:format "csv",
:csv-format {:delimiter ";", :quote "'"},
:header false,
:data-row 0,
:mapping {:concept {:code {:column 2}, :display {:column 3}}},
:code-system {:id "icd10", :url "http://hl7.org/fhir/sid/icd-10"},
:value-set
{:id "icd10", :name "icd10.accidents", :url "diagnosis-vs"}}}}}
Создайте файл resources/icd-10.csv следующего содержания:
10344;20;XX;External causes of morbidity and mortality;;;1;
16003;2001;V01-X59;Accidents;10344;;1;
15062;20012;W00-X59;Other external causes of accidental injury;16003;;1;10/07/2020
11748;2001203;W50-W64;Exposure to animate mechanical forces;15062;;1;
11870;2001203W64;W64;Exposure to other and unspecified animate mechanical forces;11748;;1;
11871;2001203W640;W64.0;Exposure to other and unspecified animate mechanical forces home while engaged in sports activity;11870;;1;
11872;2001203W641;W64.00;Exposure to other and unspecified animate mechanical forces, home, while engaged in sports activity;11871;;1;
11873;2001203W641;W64.01;Exposure to other and unspecified animate mechanical forces, home, while engaged in leisure activity;11871;;1;Инициализируйте директорию как гит-репозиторий и сделайте коммит:
git init && git add --all && git commit -m "init"Замените PATH_TO_JAR на абсолютный путь к файлу zen.jar.
Выполните следующую команду в директории проекта:
java -jar PATH_TO_JAR build-ftrЗакоммитьте FTR-директорию:
git add . && git commit -m "Build ftr"Теперь можно провалидировать ресурс на соответствие справочнику командой:
java -jar PATH_TO_JAR validate '[fhir-ru/Patient]' '{:gender "male"}'