Casos de uso: Análise Orientada a Aplicativos, Interoperabilidade, Modernização
Setores: Assistência Médica, Serviços de Saúde do Governo, Ciências da Vida
Produtos: MongoDB Atlas, MongoDB Atlas Search
Parceiros: openEHR
Visão Geral da Solução
O openEHR é uma maneira de estruturar registros clínicos para que seu significado médico permaneça consistente, mesmo quando os aplicativos e os bancos de dados evoluem. Ele separa a estrutura técnica estável do registro das definições clínicas usadas para modelar conceitos do mundo real, como observações, medicamentos ou diagnósticos.
Tecnicamente, o openEHR é uma arquitetura de EHR orientada por modelo. Seu Modelo de Referência define a estrutura estável dos registros clínicos, enquanto arquétipos e modelos adicionam o significado clínico e as restrições de implementação. Sua unidade de registro primária é o COMPOSITION, um documento clínico hierárquico cujo conteúdo é consultado através de AQL. A AQL é independente do modelo de armazenamento. Ele combina cláusulas semelhantes ao SQL com caminhos hierárquicos e predicados CONTAINS sobre estruturas clínicas aninhadas. O dimensionamento eficiente dessas consultas pode ser um desafio.
Na prática, um repositório openEHR geralmente precisa ser compatível com as seguintes famílias de consultas. A primeira corresponde à recuperação de um único paciente; por exemplo, abrir o gráfico de um paciente conhecido ou recuperar um documento clínico específico em um EHR. A segunda envolve a recuperação operacional entre pacientes; por exemplo, criar uma coorte, encontrar pacientes que satisfaçam uma regra de segurança, gerar listas de trabalho ou identificar casos semelhantes durante a prestação de cuidados. Essas consultas operacionais devem ser executadas próximas ao fluxo de trabalho da aplicação, com latência baixa e previsível.
Muitas implementações têm dificuldades para permitir ambos os padrões de consulta de forma eficiente. As abordagens relacionais podem funcionar bem para a recuperação de dados com foco no paciente, mas consultas em larga escala que abrangem vários pacientes geralmente introduzem pressão por meio de junções, alterações de esquema e variação de modelos. Descarregar essas cargas de trabalho para uma plataforma analítica separada pode ajudar na análise retrospectiva, mas cria duplicação, aumenta a latência, fragmenta a governança e os registros de auditoria e enfraquece o objetivo de uma interface de consulta AQL unificada. Isso também pode remover o contexto clínico relevante quando os documentos são simplificados de forma excessiva.
Reconciliar Famílias de Consultas Clínicas
Essa solução resolve esse problema com um modelo de persistência semiachatado e baseado no documento no MongoDB. Semiachatado significa que achatamos cada elemento como um nó em um array, mas cada um preserva toda a carga útil JSON na estrutura original. Baseada em documento significa que cada composição openEHR é preservada como um único documento MongoDB, em vez de ser decomposta em uma tabela por arquétipo ou uma linha por caminho. Ao mesmo tempo, a composição é materializada como um array de nós reconstrutível, permitindo consultas eficientes baseadas em caminhos sem abandonar a composição como unidade operacional.
Cada nó armazenado retém os seguintes elementos-chave:
Subárvore clínica local, de modo que o significado e o contexto originais permaneçam disponíveis.
Metadados posicionais, de modo que a estrutura e a ordem podem ser reconstruídas.
Caminho AQL invertido, que permite uma correspondência eficiente de restrições de caminho com profundidade variável.
O caminho invertido é uma chave de consulta geral usada para avaliar predicados estruturais de forma eficiente nas rotas de execução com foco no paciente e entre pacientes. Ela permite correspondência limitada por caminho em diferentes estratégias de execução, incluindo correspondência baseada em regex e resolução de caminho no estilo wildcard em índices de pesquisa. Os mesmos padrões de consulta podem ser aplicados quando os predicados utilizam outros componentes do caminho textual ou condições textuais.
Com esse modelo, as cláusulas AQL podem ser compiladas deterministicamente em estágios de consulta do MongoDB. FROM, CONTAINS, e WHERE restrições tornam-se predicados direcionados sobre caminhos e valores de nós. Essa abordagem mantém a composição intacta como o primário contêiner clínico, ao mesmo tempo em que torna a recuperação operacional prática em larga escala.
Figura 1. Representação de composições semiachatadas onde cada nó carrega seu próprio contexto e valores, além do caminho AQL invertido.
Observação
Para um resumo conciso e publicado da arquitetura e avaliação, leia o resumo da conferência revisado por pares.. Para obter detalhes completos do projeto, incluindo o modelo de persistência semiplano, a compilação determinística de AQL para MQL e os resultados de benchmark, leia o artigo técnico completo.
Roteamento por Carga de Trabalho
Para muitos repositórios, uma única coleção semiachatada e índices curinga são suficientes. Para implantações maiores, o modelo pode usar uma projeção de pesquisa reduzida que contenha apenas os dados necessários para uma ampla filtragem entre pacientes. A execução da consulta é então roteada por escopo. Uma projeção de pesquisa reduzida é uma coleção derivada menor que armazena apenas os campos de nó necessários para uma filtragem ampla entre pacientes. Ela não substitui o documento principal de composição. Ela reduz a amplitude do índice e o custo de pesquisa para consultas operacionais amplas.
Portanto, fornece as seguintes modalidades:
As consultas com escopo de paciente são executadas na coleção de composição principal, usando índices direcionados, como um índice composto em campos como
ehr_idereversed_path.As consultas entre pacientes são executadas na projeção mais estreita, compilando restrições de caminho em curingas ou correspondências no caminho invertido e predicados de valor em operadores de igualdade, intervalo ou pesquisa.
Esse modelo de execução fornece uma única interface de consulta, permitindo diferentes rotas de acesso físico com base no tamanho da carga de trabalho e na seletividade.
Por Que é Importante Permitir as Consultas de Operações Coorte
As aplicações clínicas modernas precisam, cada vez mais, das duas famílias de consulta na mesma plataforma. Um clínico pode precisar abrir o registro de um paciente imediatamente e fazer perguntas como:
Quais pacientes receberam um determinado medicamento em um determinado período de tempo?
Quais pacientes atendem a um protocolo ou regra de segurança?
Quais casos anteriores são clinicamente semelhantes a este?
Essas perguntas operacionais exigem respostas sem enviar dados por meio de ciclos repetitivos de ETL em sistemas separados.
Um modelo semiachatado baseado em documento preserva os pontos fortes do openEHR e torna essas cargas de trabalho práticas. Ele mantém a composição como a unidade operacional autoritativa, preserva a fidelidade clínica por meio de uma estrutura reconstituível e evita forçar as equipes de aplicativo a escolherem entre um armazenamento centrado no paciente e uma plataforma separada entre pacientes. Repositórios menores podem permanecer simples, com uma coleção semiachatada. Repositórios maiores podem adicionar uma projeção menor para reduzir o custo da filtragem operacional ampla.
Na nossa avaliação, essa abordagem manteve baixa latência de ponta a ponta em ambos os tipos de carga de trabalho, com tempos de resposta baixos para consultas de escopo de paciente e consultas entre pacientes, mesmo em grande escala. Essa eficiência valida-o como uma base prática para repositórios openEHR que devem permitir recuperação operacional, processamento com consciência de proveniência, enriquecimento semântico e fluxos de trabalho orientados por IA em uma única plataforma.
Observação
Ponto de Prova de Produção: esta arquitetura é validada em produção em um repositório com mais de 1.2 bilhão de documentos persistidos.
Você pode explorar esse padrão com o kernel, um runtime de referência experimental e um kit de ferramentas para estratégias de dados clínicos baseado em documentos.
Seguindo essa abordagem, você obtém os seguintes benefícios práticos:
Um modelo semiachatado reconstrutível que preserva a fidelidade da composição.
Consulta eficiente com escopo do paciente sem forçar uma fragmentação relacional do documento clínico.
Permissão para recuperação operacional entre pacientes sem definir como padrão uma arquitetura baseada em armazenamento.
Uma superfície de consulta operacional para equipe de aplicativo, em vez de armazenar duplicados e lógica fragmentada.
Um caminho para reduzir a sobrecarga de ETL, o desvio de governança e o custo total de propriedade.
O que é kernel e por que usá-lo?
Kernel é um runtime estratégico que transforma modelos de dados de saúde em capacidades operacionais. O kernel existe porque definir um modelo de dados de saúde não é suficiente. As equipes também precisam de uma maneira repetível de validar dados, transformá-los em uma representação operacional, ingeri-los, consultá-los, mantê-los e evoluí-los conforme os requisitos mudam. Sem essa camada de execução, os modelos frequentemente permanecem como documentação, esquemas de armazenamento ou especificações isoladas.
O objetivo é mais amplo do que construir um mecanismo openEHR. A Kehrnel fornece uma abordagem repetível de documentos 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 execução pode dar suporte a outras famílias de modelos e estratégias operacionais, incluindo FHIR, fluxos de trabalho de dados sintéticos, catálogos semânticos, recuperação de linguagem natural e outras ferramentas específicas de domínio.
O kernel foi projetado com base em 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, consulta, dados sintéticos e manutenção, sem deixar de usar um modelo de tempo de execução consistente.
O kernel começa com o openEHR porque o openEHR é um modelo exigente e rico em semântica. Inclui arquétipos, modelos, caminhos, terminologia e comportamento complexo de consultas. Isso faz dele uma base sólida para provar uma abordagem de runtime orientada por modelo.
Para esta solução, o Kernel serve como tempo de execução de referência e kit de ferramentas para o padrão de persistência baseado em documentos.
Figura 2. Captura de tela do Kernel CLI
Arquiteturas de referência
A Figura 3 mostra o fluxo de ponta a ponta dessa estratégia no kernel, desde a entrada canônica do openEHR até a execução da consulta roteada.
Figura 3. Compilador AQL e tempo de execução de roteamento (kernel)
Camada 1: as fontes de dados começam com composições canônicas do openEHR, o catálogo de modelos operacionais e dados sintéticos opcionais usados para testes em escala. O OPT é o artefato compilado em tempo de execução derivado de arquétipos e templates. Sistemas operacionais utilizam o OPT para validação e processamento com reconhecimento de caminhos.
Camada 2: o pipeline de transformação converte cada composição de entrada na representação persistente usada por essa estratégia. A etapa de semiachatamento examina 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 semiachatado por composição, com nós armazenados que mantêm uma subárvore clínica local, metadados posicionais e uma chave de caminho reverso.
Camada 3: os dicionários e o mapeamento armazenam os artefatos assistente necessários para esta estratégia. _codes e _shortcuts permitem a resolução de caminho compacto e a codificação. Os mapeamentos armazenam as regras específicas da estratégia que orientam a transformação e a compilação de consultas.
Camada 4: as coleções do MongoDB mostram as opções de persistência. A coleção de composições primárias armazena os documentos de composição semiachatados e serve para execução com escopo de paciente por meio de um índice composto em ehr_id e cn.p. Para grandes repositórios, a coleção de pesquisa opcional armazena uma projeção estreita dos pontos de dados dos nós necessários para filtragem entre pacientes. Esta coleção é indexada com o Atlas Search. O padrão de duas coleções mantém os mapeamentos de pesquisa mais restritos e os custos de pesquisa mais baixos.
Camada 5: o mecanismo de consulta é onde o kernel analisa e roteia a AQL. O runtime aceita uma declaração AQL, valida o AST, resolve alias e projeções seguras, detecta se a query tem escopo de paciente ou entre pacientes, e emite a rota MQL apropriada. Quando a consulta inclui ehr_id, o runtime emite um pipeline de agregação com escopo de paciente sobre a coleção de composições, tipicamente usando estágios como $match, $project, $sort e $limit. Quando a consulta é entre pacientes, o runtime emite um pipeline de pesquisa primeiro sobre a projeção slim, usando operadores como embeddedDocument, wildcard, range, e equals dentro de um filtro composto. Embora possa manter algumas consultas entre pacientes na coleção base quando template/time/order os predicados são compatíveis com a correspondência.
Camada 6: interfaces de tempo de execução, expõe esta estratégia por meio da CLI do kernel e da API HTTP. A CLI permite fluxos de trabalho do operador, como configuração de ambiente, ativação de estratégia, compilação e execução de consulta. A API expõe as mesmas funcionalidades de tempo de execução para integração, automação e documentação interativa.
Esse design em camadas fornece às equipes de aplicativo uma superfície de consulta operacional lógica e permite diferentes caminhos de acesso com base no tamanho do repositório, no escopo da consulta e na seletividade da carga de trabalho.
Abordagem do modelo de dados
Armazene cada composição como um documento do MongoDB, persistido de uma forma semiaplainada. Cada nó armazenado contém:
Subárvore clínica local
Chave de caminho invertido
Metadados posicionais para reconstrução
Essa estrutura torna o modelo baseado em documento e consultável em grande escala. Você evita criar um layout de tabela por arquétipo e forçar cada consulta a usar somente a forma JSON aninhada original.
Nesse modelo, os caminhos do openEHR permanecem de primeira classe. O documento persistido mantém a composição como a unidade operacional, e o array de nós fornece ao compilador uma estrutura determinística para consulta.
O documento simplificado a seguir apresenta um exemplo de composição persistente legível. Ele é formatado para explicação, de modo que os nomes de campo e os valores de caminho sejam mais fáceis de acompanhar do que em uma codificação de produção compacta.
{ "_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 do MongoDB representa uma composição do openEHR. O array cn armazena os nós consultáveis extraídos dessa composição. Cada nó mantém uma subárvore clínica local em data, uma chave de caminho invertida 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 do caminho de forma legível para facilitar a tradução. Em produção, você pode armazenar o mesmo caminho como tokens compactados codificados por dicionário para reduzir o tamanho do caminho e a pegada do índice.
Codificação de caminho invertido
O campo de caminho armazenado representa a otimização da chave. Atributos do modelo de referência e identificadores de nós de arquétipo constroem caminhos openEHR. Essa solução utiliza um caminho armazenado invertido, permitindo que as restrições de contenção sejam avaliadas com correspondência amigável ao prefixo em vez de varreduras de wildcard iniciais. Essa configuração funciona com a correspondência baseada em regex padrão na rota com escopo de paciente e com a correspondência estilo curinga na rota de pesquisa.
Tradução Determinística de AQL para MQL
O AQL é independente do modelo de armazenamento, tornando a compilação determinística eficaz. As cláusulas SQL são traduzidas para MQL da seguinte forma:
FROMeCONTAINSse tornam predicados do caminho estruturais.WHEREse tornam predicados de valor nas cargas úteis do nó correspondente.SELECTtorna-se projeção.ORDER BYse torna classificação.
O exemplo seguinte ilustra uma consulta 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 esta AQL pede
Esta consulta combina restrições estruturais e baseadas em valor. A cláusula CONTAINS define as estruturas openEHR necessárias, neste caso, uma composição de vacinação que contém um cluster administrativo e uma ação de medicamento. A cláusula WHERE em seguida adiciona predicados no tempo de ação, no identificador do executor e em um código administrativo.
Este tipo de consulta se beneficia da compilação determinística. Expressa condições sobre estruturas clínicas hierárquicas e valores locais de nós.
Como o compilador mapeia AQL para MQL
O MQL compilado segue a mesma lógica que a AQL:
O filtro
ehr_idde nível superior torna a consulta voltada para o paciente.A cláusula
$allexige que todos os ramos estruturais descritos 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 em 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 próximo exemplo mostra um padrão MQL simplificado com escopo de paciente, gerado a partir da consulta AQL acima. Ele ilustra a lógica do compilador, não uma carga útil de tempo de execução byte a 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 na coleção de gravações principais, o compilador tem como alvo a projeção esbelta da pesquisa. As restrições estruturais no caminho invertido se tornam filtros wildcard e os predicados de valor se tornam filtros de faixa e igualdade.
O próximo exemplo mostra um padrão MQL gerado a partir de um AQL que não está vinculado a um único paciente. Como antes, ele ilustra a lógica do compilador, e não uma carga útil de tempo de execução byte a 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 elementos com o mesmo caminho
Algumas estruturas openEHR podem conter nós irmãos repetidos com o mesmo caminho efetivo, por exemplo: EVENTs repetidos. Esses casos exigem que o compilador aprofunde os predicados para que as condições sejam satisfeitas pelo mesmo item repetido. Na agregação padrão, isso significa $elemMatch mais profundamente aninhado. Na rota de pesquisa, o equivalente é embeddedDocument, que vincula várias condições ao mesmo elemento de array embutido.
Construir a solução
Use o kernel, disponível neste repositório, como ambiente de execução de referência e conjunto de ferramentas para esse padrão. O kernel fornece o ciclo de vida da estratégia, o fluxo de validação, o pipeline de semi-achatamento e o caminho de compilação AQL usados para ingerir composições canônicas do openEHR e rotear consultas operacionais pelo caminho correto de execução.
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 as substituições com 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, ensino, prototipagem rápida e provas de conceito. Para reproduzir essa solução no seu próprio ambiente, siga estes passos:
Configurar o MongoDB no Atlas
Crie um cluster Atlas e decida qual banco de dados armazenará os dados da estratégia.
Nessa etapa, 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 o 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 runtime com ./startKehrnel. Esse ponto de entrada prepara o ambiente local automaticamente e mantém a primeira execução simples.
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, confira se o tempo de execução é acessível e use o kernel como plano de controle para o restante do fluxo de trabalho.
Uma vez iniciado, o kernel expõe um site Docusaurus na rota http://localhost:8080/guide. A figura 4 mostra o site.
Figura 4. Documentação do Kernel
Configure o contexto da CLI e crie um ambiente
Aponte a CLI para o runtime em execução, crie o ambiente de destino e inspecione-o. No kernel, o ambiente é a unidade de ativação. 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 kernel é compatível com vários ambientes, domínios e estratégias. Neste passo a passo, selecione explicitamente o domínio openehr e a estratégia openehr.rps_dual.
Use src/kehrnel/engine/strategies/openehr/rps_dual/defaults.json como configuração de linha de base e adicione um pequeno arquivo de modificação somente quando você quiser alterar nomes de coleção, rótulos de campo, capacitação de pesquisa, dicionários, separadores, políticas de codificação ou mapeamentos.
A ativação é a etapa em que o kernel materializa as coleções configuradas e os índices de B-tree a partir da configuração da estratégia ativa. Para o exemplo de referência agrupado, o arquivo de modificação de ativação aponta o strategy para os mapeamentos de projeção agrupados. A inicialização de dicionário é então aplicada de acordo com as configurações de ativação da estratégia.
Observação
Para entender toda a superfície de configuração openehr.rps_dual e as alterações permitidas 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 coleção, rótulos de campo, ativação do lado da pesquisa, valores iniciais do 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
Prepare modelos, mapeamentos e composições canônicas.
Trabalhe com ativos de amostra pertencentes à estratégia em src/kehrnel/engine/strategies/openehr/rps_dual/samples ou com suas próprias entradas canônicas do openEHR.
Use modelos OPT para validar ou gerar composições.
Use os mapeamentos de projeção fornecidos quando você quiser que a coleção do lado da pesquisa seja criada a partir da mesma configuração que impulsiona a ingestão e a geração do í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
Ingestão de composições
Faça a ingestão de composições por meio da estratégia. Os envelopes NDJSON empacotados são wrappers canônicos de composição openEHR que incluem a composição mascarada mais metadados, como ehr_id, template_id, composition_version e time_committed.
Use a ingestão para executar por kernel aqui, enquanto este passo a passo começa a partir de envelopes canônicos do openEHR e precisa de uma estratégia para produzir o documento de base semiachatada e, quando existirem mapeamentos para o modelo, o documento opcional de projeção 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 compactada NDJSON a partir da sua árvore de trabalho.
Quando existem mapeamentos para um modelo, o kernel também cria o documento opcional do lado da pesquisa em compositions_search. Se não existirem mapeamentos para um modelo, ele ignorará esse sidecar em vez de emitir matrizes 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 AQL
Compile AQL representativo antes de executá-lo.
Confirme o escopo resolvido, o MQL emitido e o caminho de execução selecionado.
Essa etapa de compilação é o principal contrato operacional do padrão. Os aplicativos permanecem em AQL, enquanto o kernel lida com a tradução determinística e o planejamento de execução contra o 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 consultas operacionais
Execute uma consulta com escopo de paciente e uma consulta entre pacientes no mesmo ambiente. Essa execução demonstra o valor central do padrão: uma superfície de consulta operacional, com o tempo de execução escolhendo o caminho físico correto para a carga de trabalho.
Para consultas com escopo de paciente, o tempo de execução pode ter como alvo a coleção principal semiachatada com estágios indexados $match, $project, $sort e $limit. Para uma recuperação operacional mais ampla, o tempo de execução pode encaminhar pelo caminho baseado em pesquisa quando a forma de query se beneficia 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"
Explore os artefatos gerados
Inspecione os documentos gerados do MongoDB, a projeção opcional do lado da pesquisa e a definição do índice de pesquisa do Atlas para verificar o design do documento.
Você pode ver como as composições canônicas permanecem como entrada de origem, como a forma semiachatada permite consultas determinísticas e como os mapeamentos orientam a projeção do lado da pesquisa em vez de duplicar cegamente o documento inteiro.
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 usando a CLI
Quando o fluxo base funcionar, continue com a CLI em vez de partir diretamente para a integração personalizada de API. A CLI já expõe os principais blocos 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 consultas
Execução de consulta
Este kit de ferramentas torna o kernel o plano de controle natural para o trabalho de estratégia. Um aplicativo ou IU separado pode ser usado sobre ele, mas a estratégia em si permanece portátil, inspecionável e operável diretamente através do runtime e 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
Você quer experimentar esse padrão em um ambiente controlado guiado? O Healthcare Data Lab se baseia no kernel para ajudar as equipes a modelar, consultar e testar estratégias de dados de saúde baseadas documentos, incluindo essa abordagem de persistência do openEHR. No momento, está disponível em visualização privada. Entre em contato com seu representante de conta do MongoDB para solicitar acesso.
Principais Aprendizados
Persistir composições como documentos semiflattened: mantenha um documento do MongoDB por composição, mas armazene-o de uma forma semiachatada reconstruível em vez de uma carga útil aninhada bruta.
Codifique e inverta caminhos para correspondência eficiente: transforme os caminhos estruturais de AQL em tokens compactados invertidos para que
CONTAINSpossa mapear para predicados compatíveis com prefixo.Roteirize a AQL por escopo: use
ehr_idpara manter consultas locais com escopo de pacientes e enviar consultas entre pacientes para o Atlas Search quando apropriado.Escolha uma coleção ou duas com base na escala: uma única coleção semiachatada pode funcionar bem, mas repositórios muito grandes se beneficiam de uma projeção de busca reduzida.
Mantenha uma superfície de consulta operacional: permita que as equipes de aplicativos 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
Juan Crossley, MongoDB
Saiba mais
Verifique os padrões do openEHR
Confira as especificações da openEHR AQL