Casos de uso: Análise orientada por aplicativos, interoperabilidade, modernização
Setores: Saúde, serviços governamentais de saúde, biociências
Produtos: MongoDB Atlas, Atlas Search
Parceiros: openEHR
Visão Geral da Solução
O openEHR é uma maneira de estruturar registros consultas para que seu significado médico permaneça consistente, mesmo quando aplicativos e bancos de dados evoluem. Ele separa a estrutura técnica estável do registro das definições médicas usadas para modelar conceitos do mundo real, como observações, comprimidos ou diagnósticos.
Do ponto de vista técnico, o openEHR é uma arquitetura EHR orientada por modelo. Seu Modelo de Referência define a estrutura estável dos registros internos, enquanto os arquetipos e modelos adicionam o significado interno e as restrições de implementação. Sua principal unidade de registro é COMPOSITION o, um documento médico hierárquico cujo conteúdo é consultado por meio do AQL. O AQL é independente do modelo de armazenamento. Ele combina cláusulas semelhantes a SQL com caminhos hierárquicos e CONTAINS predicados em estruturas médicas aninhadas. O dimensionamento eficiente dessas queries pode ser um desafio.
Na prática, um repositório openEHR geralmente precisa oferecer suporte às seguintes família de query. O primeiro corresponde à recuperação de um único caso, por exemplo , abrindo o gráfico de um pai conhecido ou recuperando um documento específico dentro de um EHR. O segundo envolve a recuperação operacional entre pacientes, por exemplo , construindo uma coorte, encontrando pacientes que atendam a uma regra de segurança, gerando listas de trabalho ou identificando casos semelhantes durante a assistência. Essas queries operacionais devem ser executadas próximas ao fluxo de trabalho do aplicação , com latência baixa e previsível.
Muitas implementações lutam para oferecer suporte a ambos os padrões de query de forma eficiente. As abordagens relacionais podem funcionar bem para a recuperação com escopo de usuário, mas queries em grande escala entre pacientes geralmente introduzem pressão por meio de junções, rotatividade de esquema e variação de modelo. Descarregar esses volumes de trabalho para uma plataforma analítica separada pode ajudar com a análise retrospectiva, mas cria duplicação, adiciona latência, fragmenta a administração e as faixas de auditar e fragiliza o objetivo de uma interface unificada de query AQL. Ele também pode remover o contexto médico relevante quando os documentos são achatados de forma muito agressiva.
Reconciliar família de query médica
Esta solução aborda esse problema com um modelo de persistência semi-achatado que prioriza os documentos no MongoDB . Semi-achatado significa que achatamos cada elemento como um nó em uma array, mas cada um preserva a carga útil completa do JSON na estrutura original. Documento-primeiro significa que cada composição openEHR é preservada como um documento MongoDB , em vez de ser decomposta em uma tabela por arquetipo ou uma linha por caminho. Ao mesmo tempo, a composição é materializada como uma array de nós reconstruível, permitindo uma query eficiente baseada em caminho sem abandonar a composição como unidade operacional.
Cada nó armazenado retém os seguintes elementos principais:
Subárvore médica local, para que o significado e contexto originais permaneçam disponíveis.
Metadados posicionais, para que a estrutura e a ordenação possam ser reconstruídas.
Caminho AQL invertido, que permite a correspondência eficiente de restrições de caminho de profundidade variável.
O caminho invertido é uma chave de query geral usada para avaliar predicados estruturas de forma eficiente nas rotas de execução com escopo de usuário e entre pacientes. Ele oferece suporte à correspondência restrita de caminho em diferentes estratégias de execução, incluindo a correspondência baseada em regex e a resolução de caminho no estilo curinga em índices de pesquisa. Os mesmos padrões de query podem ser aplicados quando os predicados usam outros componentes do caminho do texto ou condições do texto.
Com esse modelo, as cláusulas AQL podem ser compiladas deterministicamente nos estágios de query do MongoDB . As restrições FROM, CONTAINS e WHERE se tornam predicados direcionados sobre os caminhos e valores dos nós. Essa abordagem mantém a composição intacta como o principal contêiner analítico e, ao mesmo tempo, torna a recuperação operacional prática em escala.
figura 1. Representação de gravações semiachatadas em que cada nó carrega seu próprio contexto e valores, além do caminho inverso do AQL
Observação
Para obter um resumo conciso publicado da arquitetura e avaliação, leia o resumo da conferência analisado por pares. Para obter o design completo, incluindo o modelo de persistência semi-achatado, a compilação determinística de AQL para MQL e detalhes de parâmetro de comparação, leia o documento técnico completo.
Roteamento por volume de trabalho
Para muitos repositórios, uma única coleção semi-achatada e índices curinga são suficientes. Para implementações maiores, o modelo pode utilizar uma projeção de pesquisa fina que contém apenas os dados necessários para uma ampla filtragem entre pacientes. A execução da query é então roteada por escopo. Uma projeção de pesquisa limitada é uma collection derivada menor que armazena somente os campos de nó necessários para uma filtragem ampla entre pacientes. Não substitui o documento principal de composição . Ele reduz a largura do índice e o custo de pesquisa para amplas consultas operacionais.
Portanto, disponibiliza as seguintes formas:
As queries com escopo de doente são executadas na collection de composição principal, usando índices direcionados, como um índice composto em campos como
ehr_idereversed_path.As queries entre pacientes são executadas na projeção mais fina , compilando restrições de caminho em curingas ou correspondências no caminho inverso, e predicados de valor em operadores de igualdade, intervalo ou pesquisa.
Esse modelo de execução fornece uma única interface de query, permitindo diferentes caminhos de acesso físico com base no tamanho e na seletividade do volume de trabalho.
Por que as queries de coorte de operações de apoio são importantes
Os aplicativos gráficos modernos precisam cada vez mais de ambas as classes de query na mesma plataforma. Um médico pode precisar abrir o registro de um doente imediatamente e fazer perguntas como:
Quais pacientes receberam determinada preparação em determinada janela de tempo?
Quais pacientes correspondem a um protocolo ou regra de segurança?
Quais casos anteriores são cliticamente semelhantes a este?
Essas questões operacionais exigem respostas sem enviar dados por meio de ciclos repetidos de ETL em sistemas separados.
Um modelo semi-achatado de documentos em primeiro lugar preserva os pontos fortes do openEHR e torna essas cargas de trabalho práticas. Ele mantém a composição como a unidade operacional autoritária, preserva a fidelidade médica por meio de uma estrutura reconstruível e evita forçar as equipes de aplicação a escolher entre um armazenamento centralizado no cliente e uma plataforma separada entre pacientes. Repositórios menores podem permanecer simples, com uma coleção semi-achatada. Repositórios maiores podem adicionar uma projeção menor para reduzir o custo de uma ampla filtragem operacional.
Em nossa avaliação, essa abordagem manteve uma baixa latência de ponta a ponta em ambos os tipos de volume de trabalho, com baixos tempos de resposta para queries com escopo definido e entre pacientes, mesmo em grande escala. Essa eficiência a valida como uma base prática para repositórios openEHR que devem oferecer suporte à recuperação operacional, processamento com reconhecimento de procedência, enriquecimento semântica e fluxos de trabalho orientados por IA de uma plataforma.
Observação
ponto de prova de produção : essa arquitetura é validada na produção em um repositório com mais de 1.2 bilhões de documentos persistentes.
Você pode explorar esse padrão com o kahrnel, um tempo de execução de referência experimental e um conjunto de ferramentas para estratégias de dados físicos que priorizam o documento.
Essa abordagem oferece os seguintes benefícios práticos:
Um modelo semi-achatado reconstruível que preserva a fidelidade da composição.
Query eficiente com escopo de usuário sem forçar um fragmento relacional do documento crítico.
Suporte para recuperação operacional entre pacientes sem padronizar para uma arquitetura de armazenamento inicial.
Uma superfície de query operacional para equipes de aplicação , em vez de armazenamentos duplicados e lógica fragmentada.
Um caminho para reduzir a sobrecarga de ETL, reduzir os desvios de controle e reduzir o custo total de propriedade.
O que é Kerrnel e por que usá-lo?
O Kernel é um tempo de execução de estratégia que transforma modelos de dados de saúde em capacidades operacionais. A Kahrnel existe porque definir um modelo de dados de saúde não é suficiente. As equipes também precisam de uma maneira repetível para validar dados, transformá-los em uma representação operacional, ingeri-los, consultá-los, mantê-los e evoluí-los à medida que os requisitos mudam. Sem essa camada de execução, os modelos geralmente permanecem documentação, esquemas de armazenamento ou especificações isoladas.
O objetivo é mais amplo do que construir um mecanismo openEHR. A Kohrnel oferece uma abordagem repetível de documentos em primeiro lugar para tornar os modelos de dados de saúde executáveis, inspecionáveis e reutilizáveis em APIs, ferramentas e fluxos de trabalho de IA. Com o tempo, o mesmo padrão de tempo de execução pode oferecer suporte a outras família de modelos e estratégias operacionais, incluindo FHIR, fluxos de trabalho de dados sintéticos, catálogos semânticas, recuperação de linguagem natural e outras ferramentas específicas de domínio.
O Kernel foi projetado em torno de fluxos de trabalho expostos que podem ser personalizados para as necessidades de cada estratégia de persistência. Cada estratégia pode definir suas próprias operações de ativação, validação, ingestão, transformação, query, dados sintéticos e manutenção, sem deixar de usar um modelo de tempo de execução consistente.
Kernel começa com o openEHR porque o openEHR é um modelo exigente e rico em semântica. Inclui arquetipos, modelos, caminhos, terminologia e comportamento de query complexo. Isso o torna uma base sólida para provar uma abordagem de tempo de execução orientada por modelo.
Para esta solução, o Kohrnel serve como tempo de execução de referência e conjunto de ferramentas para o padrão de persistência do documento em primeiro lugar.
figura 2. Captura de tela do Keyrnel CLI
Arquiteturas de referência
A figura 3 mostra o fluxo de ponta a ponta dessa estratégia em Kernel, da entrada canônica openEHR à execução de query roteada.
figura 3. Compilador AQL e tempo de execução de roteamento (kehrnel)
1Camada: as fontes de dados começam com composição canônica openEHR, o catálogo de modelos operacionais e dados sintéticos opcionais usados para testes em escala. O OPT é o artefato de tempo de execução compilado derivado de arquetipos e modelos. Os sistemas operacionais usam o OPT para validação e processamento com reconhecimento de caminho.
2Camada: o pipeline de transformação converte cada composição recebida na representação persistente usada por essa estratégia. A etapa semi-achatada verifica a hierarquia de composição, aplica codificação de caminho e código e usa regras de mapeamento para materializar nós consultáveis. O resultado produz um documento MongoDB semi-achatado por composição, com nós armazenados que mantêm uma subárvore médica local, metadados posicionais e uma chave de caminho reverso.
3Camada: dicionários e mapeamento armazenam os artefatos assistente necessários para esta estratégia. _codes e _shortcuts suportam resolução e codificação de caminho compacto. Os mapeamentos armazenam as regras específicas da estratégia que impulsionam a transformação e a compilação de queries.
4Camada: as collections do MongoDB mostram as opções de persistência. A coleção de composição primária armazena os documentos de composição semi-achatados e atende à execução com escopo definido pelo usuário por meio de um índice composto ehr_id em cn.p e. Para repositórios grandes, a collection de pesquisa opcional armazena uma projeção fino dos pontos de dados do nó necessários para filtragem entre pacientes. Esta coleção é indexada com o Atlas Search. O padrão de coleção dupla mantém os mapeamentos de pesquisa mais restritos e o custo de pesquisa mais baixo.
5Camada: o mecanismo de query é onde analisa e roteia o AQL. O tempo de execução aceita uma declaração AQL, valida o AST, resolve aliases e projeções seguras, detecta se a query tem escopo de doente ou entre pacientes e emite a rota MQL apropriada. Quando a query ehr_id inclui, o tempo de execução emite um agregação pipeline com escopo definido pelo usuário sobre a collection de composição, normalmente usando estágios $match $projectcomo,, $sort $limite. Quando a query é cruzada, o tempo de execução emite um pipeline de pesquisa primeiro sobre a projeção fino ,embeddedDocument usandowildcard operadoresrange como,, e equals dentro de um filtro composto. Embora ele possa manter algumas consultas entre pacientes na coleção base quando template/time/order os predicados são compatíveis com a correspondência.
6Camada: interfaces de tempo de execução, expõe essa estratégia por meio da CLI do kernel e da API HTTP. A CLI é compatível com fluxos de trabalho de operadores, como configuração de ambiente, ativação de estratégia, compilação e execução de query. A API expõe os mesmos recursos de tempo de execução para integração, automação e documentação interativa.
Esse design em camadas oferece às equipes de aplicação uma superfície de query operacional lógica e permite diferentes caminhos de acesso com base no tamanho do repositório, no escopo da query e na seletividade do volume de trabalho.
Abordagem do modelo de dados
Armazene cada composição como um documento do MongoDB , persistente em um formato semiplano. Cada nó armazenado contém:
Subárvore médica local
Chave de caminho invertido
Metadados posicionais para reconstrução
Essa estrutura torna o modelo documento primeiro e consultável em escala. Você evita criar um layout de tabela por arquetipo e forçar cada query a usar somente a forma JSON aninhada original.
Neste modelo, os caminhos openEHR permanecem de primeira classe. O documento persistente mantém a composição como unidade operacional, e a array de nós fornece ao compilador uma estrutura determinística para query.
O seguinte documento simplificado mostra um exemplo de composição persistente legível. Ele é formatado para explicação, portanto, os nomes dos campo e os valores do caminho são mais fáceis de seguir do que em uma codificação compacta de produção.
{ "_id": "...", "ehr_id": "patient-001", "composition_id": "c-001", "template_id": "openEHR-EHR-COMPOSITION.vaccination_list.v0", "version": 1, "cn": [ { "p": "ACTION.medication.v1.SECTION.immunisation_list.v0.COMPOSITION.vaccination_list.v0", "kp": "content[0]/items[0]", "pi": [0,0], "bk": "b1", "data": { "time": { "value": "2026-01-15T10:30:00Z" }, "other_participations": { "performer": { "identifiers": { "id": "038321545" } } }, "code": { "value": "J07BX03" } } } ] }
Como ler este documento
Um documento MongoDB representa uma composição openEHR. A array cn armazena os nós consultáveis extraídos dessa composição. Cada nó mantém uma subárvore médica local em data, uma chave de caminho reverso em p e metadados posicionais como kp, pi e bk para que a estrutura original possa ser reconstruída.
O exemplo público mostra a chave de caminho em um formato legível para facilitar o acompanhamento da tradução. Na produção, você pode armazenar o mesmo caminho que os tokens codificados pelo dicionário compacto para reduzir o tamanho do caminho e a pegada do índice
Codificação de caminho inverso
O campo de caminho armazenado representa a otimização da chave. Atributos do modelo de referência e identificadores de nó de arquetipo constroem caminhos openEHR. Essa solução usa um caminho armazenado inverso, permitindo que as restrições de contenção sejam avaliadas com correspondência compatível com prefixos em vez de varreduras curingas. Essa configuração funciona com a correspondência baseada em regex padrão na rota com escopo definido pelo cliente e com a correspondência no estilo curinga na rota de pesquisa.
Tradução de AQL determinístico para MQL
O AQL é independente do modelo de armazenamento, tornando a compilação determinística eficaz. As cláusulas SQL são convertidas para MQL da seguinte forma:
FROMeCONTAINSse tornam predicados de caminho estrutural.WHEREtornam-se predicados de valor nas cargas úteis do nó correspondente.SELECTtorna-se projeção.ORDER BYtorna-se classificação.
O exemplo a seguir ilustra uma query AQL.
SELECT e/ehr_id/value AS ehrId, c/uid/value AS compositionId, med_ac/description[at0017]/items[at0140]/items[at0141]/value/defining_code/code_string AS locationCode FROM EHR e CONTAINS COMPOSITION c[openEHR-EHR-COMPOSITION.vaccination_list.v0] CONTAINS ( CLUSTER adminInfo[openEHR-EHR-CLUSTER.admin_salut.v0] AND SECTION[openEHR-EHR-SECTION.immunisation_list.v0] AND ACTION med_ac[openEHR-EHR-ACTION.medication.v1] ) WHERE med_ac/time/value >= '2000-04-13T07:54:16.345Z' AND med_ac/time/value <= '2026-02-13T07:54:16.345Z' AND adminInfo/items[at0007]/items[at0014]/value/defining_code/code_string = 'E08019820' AND med_ac/other_participations/performer/identifiers/id = '038321545' ORDER BY med_ac/time/value DESC
O que este AQL pede
Esta query combina restrições estruturas e baseadas em valor. A cláusula CONTAINS define as estruturas openEHR necessárias, no caso, uma composição de imunização que contém um cluster administrativo e uma ação de preparação. Em seguida, a cláusula WHERE adiciona predicados no tempo de ação , no identificador do executor e um código administrativo.
Este tipo de query se beneficia da compilação determinística. Expressa condições sobre estruturas médicas hierárquicas e valores nó-local.
Como o compilador mapeia o AQL para o MQL
O MQL compilado segue a mesma lógica do AQL:
O filtro de nível superior
ehr_idtorna a query com escopo definido pelo cliente.A cláusula
$allexige que todas as ramificações estruturas descritas pela AQL estejam presentes na mesma composição.Cada
$elemMatchvincula um predicado de caminho e seus predicados de valor ao mesmo nó armazenado.O predicado em
pé a forma compilada da lógica estruturalCONTAINS.Os predicados sob dados são a forma compilada das condições
WHERE.Em um pipeline completo, o compilador adiciona os estágios de projeção e classificação que correspondem a
SELECTeORDER BY.
O exemplo a seguir mostra um padrão simplificado de MQL com escopo de usuário gerado a partir da query AQL acima. Ele ilustra a lógica do compilador, não uma carga de tempo de execução byte-by-byte.
// Simplified compiler output for a single-EHR query. // Projection and sorting stages are omitted here for clarity. db.compositions.aggregate([ { "$match": { "ehr_id": "b416bc97-de39-43f5-9d47-712af6688947~r1", "cn": { "$all": [ { "$elemMatch": { "p": { "$regex": /^ACTION\.medication\.v1(?:\.[^.]+)*\.SECTION\.immunisation_list\.v0(?:\.[^.]+)*\.COMPOSITION\.vaccination_list\.v0$/ }, "data.time.value": { "$gte": ISODate("2000-04-13T07:54:16.345Z"), "$lte": ISODate("2026-02-13T07:54:16.345Z") }, "data.other_participations.performer.identifiers.id": "038321545" } }, { "$elemMatch": { "p": { "$regex": /^at0014\.at0007\.CLUSTER\.admin_salut\.v0(?:\.[^.]+)*\.COMPOSITION\.vaccination_list\.v0$/ }, "data.value.defining_code.code_string": "E08019820" } } ] } } } ]);
Como a mesma lógica se move para a rota de pesquisa
A tradução lógica permanece a mesma na rota entre pacientes. A diferença é a execução física. Em vez de fazer a correspondência com a coleção de composição principal, o compilador tem como alvo a projeção de pesquisa fino . As restrições estruturas no caminho inverso se tornam filtros curinga, e os predicados de valor se tornam filtros de intervalo e igualdade.
O exemplo a seguir mostra um padrão de MQL gerado a partir de um AQL não vinculado a um doente. Como antes, ele ilustra a lógica do compilador, não uma carga útil de tempo de execução byte-by-byte.
{ "$search": { "index": "search_nodes_index", "compound": { "filter": [ { "embeddedDocument": { "path": "sn", "operator": { "compound": { "filter": [ { "wildcard": { "path": "sn.p", "query": "ACTION.medication.v1*SECTION.immunisation_list.v0*COMPOSITION.vaccination_list.v0" } }, { "range": { "path": "sn.data.time.value", "gte": ISODate("2000-04-13T07:54:16.345Z"), "lte": ISODate("2025-04-13T07:54:16.345Z") } }, { "equals": { "path": "sn.data.other_participations.performer.identifiers.id", "value": "038321545" } } ] } } } } ] } } }
Estruturas repetidas e irmãos do mesmo caminho
Algumas estruturas openEHR podem conter nós irmãos repetidos com o mesmo caminho efetivo, por exemplo , EVENTs repetido. Esses casos exigem que o compilador empurre os predicados mais profundamente para que as condições sejam satisfeitas pelo mesmo item repetido. Na agregação padrão , isso significa $elemMatch aninhado mais profundo. Na rota de pesquisa, o equivalente é embeddedDocument, que vincula várias condições ao mesmo elemento de array incorporado.
Construir a solução
Use o Kernel, disponível neste repositório, como tempo de execução de referência e conjunto de ferramentas para este padrão. A Kernel fornece o ciclo de vida da estratégia, o fluxo de validação, o pipeline semi-achatador e o caminho de compilação AQL usados para consumir compostos canônicos openEHR e rotear queries operacionais por meio do caminho de execução correto.
No momento da ativação, o Kernel expõe a estratégia por meio de manifest.json, usa defaults.json como linha de base de ativação, valida substituições por schema.json e aplica o plano de armazenamento e índice descrito pela implementação da estratégia e spec.json. O caminho recomendado é permitir que o Kernel crie coleções e índices de B-tree a partir da configuração ativa, em vez de criá-los manualmente no MongoDB primeiro.
O repositório posiciona o Kernel como um tempo de execução experimental para demonstração, ensinamento, criação rápida de protótipos e prova de conceitos. Para reproduzir esta solução em seu próprio ambiente, siga estas etapas:
Configurar o MongoDB no Atlas
Crie um cluster do Atlas e decida qual banco de dados manterá os dados da estratégia.
Nesse estágio, você só precisa do nome do banco de dados de destino e da string de conexão.
Para macOS e Linux:
export MONGODB_URI="<your-atlas-connection-string>" export MONGODB_DB="openEHR_demo"
Para Windows Powershell:
set MONGODB_URI=<your-atlas-connection-string> set MONGODB_DB="openEHR_demo" exit
Clone o repositório do GitHub e inicie o Kernel
Clone o repositório e inicie o tempo de execução ./startKehrnel com. Esse ponto de entrada prepara o ambiente local automaticamente e simplifica a primeira execução.
git clone https://github.com/mongodb-industry-solutions/kehrnel cd kehrnel ./startKehrnel export RUNTIME_URL="${RUNTIME_URL:-http://localhost:8080}" Alternative direct API entrypoint: uvicorn kehrnel.api.app:app --reload --port 8080
Após a inicialização, confirme se o tempo de execução está acessível e use o Kernel como plano de controle para o restante do fluxo de trabalho.
Uma vez iniciado, o kahrnel expõe um site Docusaurus na rota http://localhost:8080/guide. A figura 4 mostra o site.
figura 4. Documentação do Kernel
Configurar o contexto CLI e criar um ambiente
Aponte a CLI para o tempo de execução em execução, crie o ambiente de destino e inspecione-o. O ambiente é a unidade de ativação no kernel. Ele isola a configuração da estratégia, as vinculações, os artefatos gerados e o estado operacional sem forçar alterações no código da estratégia.
Point the CLI at the running kehrnel runtime kehrnel context set --runtime-url "$RUNTIME_URL" kehrnel core health kehrnel core env create --env dev --name "Development" kehrnel core env list kehrnel core env show --env dev
Descubra e ative a estratégia
O Kahrnel oferece suporte a vários ambientes, domínios e estratégias. Nesta apresentação passo a passo, selecione explicitamente o domínio openehr e a estratégia openehr.rps_dual.
Utilize o src/kehrnel/engine/strategies/openehr/rps_dual/defaults.json como a configuração de linha de base e adicione um pequeno arquivo de substituição somente quando você deseja alterar nomes de coleção, etiquetas de campo , habilitação de pesquisa, dicionários, separadores, políticas de codificação ou mapeamentos.
A ativação é a etapa em que kahrnel materializa as coleções configuradas e os índices de B-tree da configuração da estratégia ativa. Para o exemplo de referência em pacote, o arquivo de substituição de ativação aponta strategy para os mapeamentos de projeção em pacote. A inicialização do dicionário é então aplicada de acordo com as configurações de ativação da estratégia.
Observação
Para entender a superfície openehr.rps_dual de configuração completa do e as alterações suportadas que você pode aplicar, consulte o guia de configuração de estratégia. Este guia explica o que cada configuração na linha de base da estratégia controla, incluindo nomes de collections, etiquetas de campo , ativação do lado da pesquisa, sementes de dicionário, separador de caminho e políticas de codificação
mkdir -p .kehrnel Local plaintext MongoDB bindings for the walkthrough cat > .kehrnel/bindings.mongo.yaml <<EOF db: provider: mongodb uri: ${MONGODB_URI} database: ${MONGODB_DB} EOF Packaged activation override for the reference dual-collection example kehrnel core env activate \ --env dev \ --domain openehr \ --strategy openehr.rps_dual \ --config src/kehrnel/engine/strategies/openehr/rps_dual/samples/reference/activation.config.json \ --allow-plaintext-bindings \ --bindings .kehrnel/bindings.mongo.yaml \ --force Ensure bundled dictionaries are present kehrnel run ensure_dictionaries --env dev --domain openehr Generate the Atlas Search definition derived from the active mappings kehrnel strategy build-search-index \ --env dev \ --domain openehr \ --strategy openehr.rps_dual \ --out .kehrnel/search-index.json
Preparar modelos, mapeamentos e compostos canônicos
Trabalhe com ativos de amostra de propriedade da estratégia em src/kehrnel/engine/strategies/openehr/rps_dual/samples ou com suas próprias entradas openEHR canônicas.
Use modelos OPT para validar ou gerar redações.
Use os mapeamentos de projeção empacotados quando desejar que a collection do lado da pesquisa seja construída a partir da mesma configuração que impulsiona a geração de ingestão e índice de pesquisa.
SAMPLES_ROOT="src/kehrnel/engine/strategies/openehr/rps_dual/samples/reference" Inspect the packaged reference assets ls "$SAMPLES_ROOT/templates" ls "$SAMPLES_ROOT/queries" ls "$SAMPLES_ROOT/envelopes" ls "$SAMPLES_ROOT/projection_mappings.json" \ "$SAMPLES_ROOT/search_index.definition.json" \ "$SAMPLES_ROOT/manifest.json" Optional: generate and validate a sample composition from a packaged OPT kehrnel common generate -- \ -t "$SAMPLES_ROOT/templates/sample_laboratory_v0_4.opt" \ -o .kehrnel/composition.json \ --random kehrnel common validate -- \ -c .kehrnel/composition.json \ -t "$SAMPLES_ROOT/templates/sample_laboratory_v0_4.opt" \ --stats Optional: generate a starter source-to-canonical mapping skeleton kehrnel common map-skeleton -- \ "$SAMPLES_ROOT/templates/sample_laboratory_v0_4.opt" \ -o .kehrnel/mapping.skeleton.yaml \ --macros
Composições de ingestão
Ingerir compostos por meio da estratégia. Os envelopes NDJSON empacotados são wrappers de composição openEHR canônicos que incluem a composição máscarada mais metadados como ehr_id, template_id, composition_version e time_committed.
Use a ingestão de execução rápida aqui, enquanto este passo a passo começa com envelopes canônicos openEHR e precisa da estratégia para produzir o documento de base semi-achatado e, quando houver mapeamentos para o modelo, o documento de projeção opcional do lado da pesquisa.
Os sinalizadores de arquivo local abaixo são apenas uma proteção que permite ao tempo de execução ler a amostra NDJSON embalada da sua árvore de trabalho.
Quando existem mapeamentos para um modelo, o Kernel também cria o documento opcional do lado da pesquisa no compositions_search. Se não existirem mapeamentos para um modelo, ele pulará esse sidecar em vez de emitir arrays vazias.
The CLI expands the local NDJSON into documents before sending the request. kehrnel run ingest \ --env dev \ --domain openehr \ --strategy openehr.rps_dual \ --set file_path="$SAMPLES_ROOT/envelopes/all.ndjson"
Compilar e inspecionar o AQL
Compile o AQL representativo antes de executá-lo.
Confirme o escopo resolvido, o MQL emitido e o caminho de execução selecionado.
Esta etapa de compilação é o principal contrato operacional do padrão. Os aplicativos permanecem no AQL, enquanto o kahrnel lida com a tradução determinística e o planejamento de execução em relação ao modelo de armazenamento.
Compile only: inspect the execution plan without running the query kehrnel core env compile-query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/patient_laboratory_by_ehr.aql" kehrnel core env compile-query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/cross_patient_laboratory_by_performing_centre.aql"
Executar queries operacionais
Execute uma query com escopo de usuário e uma query entre pacientes no mesmo ambiente. Essa execução demonstra o valor central do padrão: uma superfície de query operacional, com o tempo de execução escolhendo o caminho de execução física correto para o volume de trabalho.
Para consultas com escopo definido pelo cliente, o tempo de execução pode direcionar a coleção semi-achatada principal com estágios $match, $project, $sort e $limit indexados. Para uma recuperação operacional mais ampla, o tempo de execução pode ser roteado pelo caminho orientado à pesquisa quando a forma de query se beneficiar dele.
Execute both representative queries kehrnel core env query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/patient_laboratory_by_ehr.aql" kehrnel core env query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/cross_patient_laboratory_by_performing_centre.aql"
Explorar os artefatos gerados
Inspecione os documentos gerados do MongoDB , a projeção opcional do lado da pesquisa e a definição do índice do Atlas Search para verificar o design do documento primeiro.
Você pode ver como as gravações canônicas continuam sendo a entrada de origem, como o formato semiachatado oferece suporte à query determinística e como os mapeamentos impulsionam a projeção do lado da pesquisa em vez de duplicar todo o documento às ocultas.
Inspect the generated base and search-side documents mongosh "$MONGODB_URI/$MONGODB_DB" <<'MONGOSH' db.compositions_rps.findOne({}, { ehr_id: 1, tid: 1, time_c: 1, cn: { $slice: 3 } }) db.compositions_search.findOne({}, { ehr_id: 1, comp_id: 1, tid: 1, sort_time: 1, sn: 1 }) MONGOSH Inspect the generated Atlas Search definition cat .kehrnel/search-index.json
Estenda o padrão pela CLI
Quando o fluxo base funcionar, continue com a CLI em vez de ir direto para a fiação da API personalizada. A CLI já expõe os principais blocos de construção operacionais:
Ciclo de vida do ambiente
Ativação da estratégia
Configuração do dicionário
Geração de índice de pesquisa
Compilação de query
Execução da query
Este conjunto de ferramentas faz do Kernel o plano de controle natural para o trabalho de estratégia. Um aplicação ou interface de usuário separada pode ficar sobre ele, mas a estratégia em si permanece portátil, inspecionável e operável diretamente por meio do tempo de execução e da CLI.
Continue through the CLI for strategy operations and discovery kehrnel op capabilities --env dev kehrnel op schema synthetic_generate_batch --strategy openehr.rps_dual kehrnel run rebuild_codes --env dev --domain openehr kehrnel run rebuild_shortcuts --env dev --domain openehr kehrnel run build_search_index_definition \ --env dev \ --domain openehr \ --strategy openehr.rps_dual
Observação
Deseja experimentar esse padrão em uma sandbox guiada? O Laboratório de Dados de Saúde se baseia no kernel para ajudar as equipes a modelar, consultar e testar estratégias de dados de saúde que priorizam documentos, incluindo essa abordagem de persistência openEHR. Atualmente, ele está disponível em visualização privada. Entre em contato com seu representante de conta do MongoDB para solicitar acesso.
Principais Aprendizados
Composições persistentes como documentos semi-achatados: mantenha um documento do MongoDB por composição, mas armazene-o em um formato semi-achatado reconstruível em vez de uma carga útil bruta aninhada.
Caminhos reversos e codificados para correspondência eficiente: transforme os caminhos estruturas do AQL em tokens invertidos compactos para que
CONTAINSo possa mapear para predicados compatíveis com prefixos.Direcionar AQL por escopo: use
ehr_idpara manter as queries com escopo de doente locais e enviar queries de vários pacientes para o Atlas Search quando apropriado.Escolha uma collection ou duas com base na escala: uma única collection semi-achatada pode funcionar bem, mas repositórios muito grandes se beneficiam de uma projeção de pesquisa limitada.
Mantenha uma superfície de query operacional: deixe que as equipes de aplicação permaneçam no AQL enquanto o tempo de execução lida com a compilação determinística e o planejamento de execução.
Autores
Francesc Mateu Amengual, MongoDB
Giovanni Rodriguez, MongoDB
Greg Cox, MongoDB
João Crosslei, MongoDB
Saiba mais
Verifique os padrões openEHR
Verifique as especificações do openEHR AQL