Esta é uma continuação do meu post anterior que abordou o tópico do modelo de dados FHIR com o Couchbase N1QL. Neste blog, discutirei o tópico de como implementar o servidor da API REST do FHIR Search nos serviços do Couchbase, incluindo exemplos reais de como os diferentes padrões de pesquisa do FHIR funcionam com o Couchbase usando os dados sintéticos do FHIR fornecidos pela Synthea.
Consulte meu blog anterior para obter informações básicas sobre Modelo de dados FHIR com o Couchbase N1QL.
Por que isso é de seu interesse?
- Sua organização está planejando desenvolver um sistema de prontuário eletrônico de saúde (EHR) compatível com FHIR e está pensando em aproveitar os muitos benefícios dos bancos de dados NoSQL, como distribuído, alta disponibilidade, XDCR e escalabilidade multidimensional.
- Você é um arquiteto ou desenvolvedor e gostaria de entender como o banco de dados JSON do Couchbase pode reduzir muito a complexidade dos seus aplicativos, relegando o complexo FHIR Search [https://www.hl7.org/fhir/searchparameter-registry.html] processamento para a camada do servidor de banco de dados.
- Você é um analista de dados e gostaria de entender como pode aproveitar seu conhecimento de SQL para consultar dados FHIR diretamente com Couchbase N1QL e Pesquisa de texto completo.
- Você está interessado em descobrir como o Couchbase N1QL, um SQL para JSON, pode fornecer uma maneira eficiente de consultar um modelo de dados JSON que é hierárquico e relacional por natureza, conforme definido por Módulo administrativo HL7.
Aplicativo FHIR com o Couchbase
O diagrama acima mostra os processos envolvidos em um aplicativo FHIR típico. O servidor FHIR Rest é fundamental para esse aplicativo e precisa oferecer suporte às especificações de pesquisa, conforme especificado pelo FHIR https://www.hl7.org/fhir/search.html. O servidor REST gerencia todas as interações entre os aplicativos clientes e traduz as solicitações de pesquisa FHIR em instruções N1QL e envia as solicitações para o Couchbase Query Service.
Como configurar o servidor FHIR com o Couchbase
Você pode configurar o servidor de API FHIR do Couchbase e o banco de dados NoSQL do Couchbase em um único servidor ou até mesmo em seu laptop. O processo de configuração requer:
- Instalação do Couchbase Server 6.5.
- Carregue os dados do Synthea no servidor Couchbase.
- Implante o código do dotnet FHIR Server.
Siga as instruções https://github.com/AV25242/dotnet-fhir-server-couchbase.git
Conjunto de dados de amostra FHIR
Antes de começar a usar a pesquisa FHIR para fazer consultas, vamos nos familiarizar com o conjunto de dados de amostra FHIR.
- O conjunto de dados Synthea consiste em 1.000 registros sintéticos de pacientes.
- O registro do paciente está em um formato de pacote de recursos FHIR, o que significa que um registro de paciente inclui todos os objetos FHIR relacionados ao paciente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
"Praticante" "ImagingStudy" (Estudo de imagem) "MedicationRequest" "Condição" "Dispositivo" "DiagnosticReport" (Relatório de diagnóstico) "CarePlan" "Encounter" (Encontro) "CareTeam" "Reclamação" "Procedimento" "Imunização" "Observação" "MedicationAdministration" (Administração de medicamentos) "Organização" "Meta" "ExplanationOfBenefit" (Explicação do benefício) "AllergyIntolerance" |
Para fins desta demonstração, o conjunto de recursos do paciente foi normalizado em documentos de tipos de recursos individuais, para que possamos consultar o objeto FHIR direta ou indiretamente por meio do ID de referência do objeto.

O modelo FHIR é mostrado com relações para transmitir que
Pesquisas FHIR
Você pode testar o servidor da API REST usando qualquer cliente REST de sua preferência. Para simplificar, uso o CURL em meu terminal.
1. Pesquisar qualquer recurso FHIR
1 |
>enrolar -X OBTER http:///Fhir/api/Patient |
1 |
>enrolar -X OBTER http:///Fhir/api/Practitioner |
2. Pesquisar recursos por id
Todos os recursos FHIR têm um identificador de id e podem ser pesquisados diretamente.
1 |
>enrolar -X OBTER http:///Fhir/api/Patient/8850c4aa-cb77-4659-8373-980882405846 |
1 |
>enrolar -X OBTER http:///Fhir/api/Patient?id=8850c4aa-cb77-4659-8373-980882405846 |
1 |
>enrolar -X OBTER http:///Fhir/api/Organization?id=d32bd7bd-4211-34d8-a08b-b1b2b810d41b |
3. Pesquisar recursos por qualquer campo de nível superior
Pesquise todos os pedidos de indenização de seguro fornecidos pelo "BAYSIDE MEDICAL CENTER"
1 |
>enrolar -X OBTER http:///Fhir/api/Claim?provider.display=BAYSTATE MEDICAL CENTER |
4. Recurso de pesquisa por nome - N1QL ARRAY Search
O recurso FHIR tem uma estrutura abrangente para capturar o nome do recurso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
"name" (nome): [ { "família": "Assistente", "dado": [ "Buffy" ], "prefixo": [1 item], "uso": "oficial" }, { "família": "Schneider", "dado": [ "Tootsie" ], "prefixo": [1 item], "uso": "donzela" } ] |
A pesquisa FHIR por nome deve levar em conta todos os diferentes nomes que o paciente pode usar.
1 |
>enrolar -X OBTER http:///Fhir/api/Patient/?name=Buffy |
5. Pesquisar pacientes por identificador médico - N1QL ARRAY Search
A FHIR também oferece suporte a identificadores para o recurso. No exemplo abaixo, um paciente pode ser identificado com seu SSN e OID (para sistemas não FHIR).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
"paciente": { "endereço": [1 item], "birthDate" (data de nascimento): "1946-11-29", "comunicação": [1 item], "deceasedDateTime" (data e hora do falecimento): "1983-03-25T09:56:18-08:00", "extensão": [7 itens], "gênero": "feminino", "id": "b495844d-22d0-4045-a00d-99f6799df265", "identificador": [ {2 itens}, {3 itens}, { "sistema": "http://hl7.org/fhir/sid/us-ssn", "tipo": {2 itens}, "valor": "999-46-2135" }, { "sistema": "urn:oid:2.16.840.1.113883.4.3.25", "tipo": {2 itens}, "valor": "S99963447" }, {3 itens} ], "maritalStatus": {2 itens}, "multipleBirthBoolean": falso, "name" (nome): [1 item], "resourceType": "Paciente", "telecom": [1 item], "texto": {2 itens} } |
Pesquisar o paciente pelo identificador do SSN
1 |
>enrolar -X OBTER http:///Fhir/api/Patient?identifier=http://hl7.org/fhir/sid/us-ssn|999-46-2135 |
6. Recurso de pesquisa por sistema/código médico - N1QL ARRAY Search
O FHIR usa o código médico para identificar o procedimento, a observação ou o relatório de diagnóstico.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
"diagnosticreport" (relatório de diagnóstico): { "category" (categoria): [1 item], "código": { "codificação": [ { "código": "57698-3", "display": "Painel de lipídios", "sistema": "http://loinc.org" } ], "texto": "Painel de lipídios" }, "effectiveDateTime": "2016-08-17T14:24:27-07:00", "encontro": {1 item}, "id": "38f2e919-894c-4277-ba00-372c18c9cced", "emitido": "2016-08-17T14:24:27.878-07:00", "resourceType": "DiagnosticReport" (Relatório de diagnóstico), "resultado": [4 itens], "status": "final", "assunto": {1 item} } |
Pesquisar o DiagnosticReport por seu sistema e código
1 |
>enrolar -X OBTER http:///Fhir/api/DiagnisticReport?code=http://loinc.org|57698-3 |
7. Recurso de pesquisa por telefone/e-mail - N1QL ARRAY Search
O registro FHIR encapsula todos os canais de comunicação com o recurso no campo "telecom".
1 2 3 4 5 6 7 8 9 10 11 12 |
"telecom": [ { "sistema": "email", "uso": "trabalho", "valor": "Quinton758.Hammes673@example.com" }, { "sistema": "telefone", "uso": "casa", "valor": "555-270-6484" } ] |
A pesquisa FHIR sobre telecomunicações deve levar em conta todos os diferentes tipos de telecomunicações que o recurso pode usar.
Pesquisar pacientes por telefone
1 |
>enrolar -X OBTER http:///Fhir/api/Patient/?phone=555-270-6484 |
Pesquisar profissionais por e-mail
1 |
>enrolar -X OBTER http:///Fhir/api/Practioner/?email=Quinton758.Hammes673@example.com |
Pesquisar hospitais por telefone
1 |
>enrolar -X OBTER http:///Fhir/api/Organization/?phone=978-524-7933 |
8. Recurso de pesquisa usando o intervalo de datas - N1QL Range Scan
Os objetos FHIR podem incluir um intervalo de data e hora para indicar o período em que um evento ocorreu.
1 2 3 4 |
"performedPeriod": { "fim": "2011-07-06T23:03:22-07:00", "start": "2011-07-06T22:48:22-07:00" }, |
Procedimentos de busca que ocorreram entre duas datas
1 |
>enrolar -X OBTER http:///Fhir/api/Procedure?performedPeriod.start=ge2011-07-07&performedPeriod.end=le2011-07-08 |
9. Recurso de pesquisa com pesquisa de _texto - Couchbase FTS
A especificação de pesquisa FHIR também inclui um recurso de pesquisa de texto. Uma solicitação de pesquisa usando o campo '_text' instruirá o servidor a realizar uma pesquisa de texto em todo o campo de texto.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
"condição": { "abatementDateTime": "2019-06-01T20:53:48-07:00", "clinicalStatus" (status clínico): {1 item}, "código": { "codificação": [1 item], "texto": "Fratura de tornozelo" }, "encontro": {1 item}, "id": "f2e4b232-513c-4222-9568-6fbe096bb6ba", "onsetDateTime": "2019-04-02T20:53:48-07:00", "recordedDate" (data registrada): "2019-04-02T20:53:48-07:00", "resourceType": "Condição", "assunto": {1 item}, "verificationStatus": {1 item} } |
Condições de pesquisa com o termo 'Fracture' na descrição do texto.
1 |
>enrolar -X OBTER http:///Fhir/api/Condition?_text=Fracture |
Pesquisar observações com o termo "Cholesterol" na descrição do texto.
1 |
>enrolar -X OBTER http:///Fhir/api/Observation?_text=Cholesterol |
10. Pesquisar pacientes por seus objetos relacionados - N1QL JOIN
O modelo de dados FHIR é de natureza relacional. Os objetos associados a um paciente contêm o ID do paciente no campo de assunto. Um paciente tem vários CarePlans, e o plano tem um campo de assunto com o ID do paciente para indicar que o plano de tratamento pertence ao paciente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
"careplan": { "atividade": [2 itens], "endereços": [1 item], "careTeam": [1 item], "category" (categoria): [1 item], "encontro": {1 item}, "id": "49b2239e-da9c-447a-9e7c-f5721339cf2f", "intenção": "ordem", "período": { "start": "2015-03-22T21:38:17-07:00" }, "resourceType": "CarePlan", "status": "ativo", "assunto": { "referência": "urn:uuid:9aa55fa8-0422-4ca4-bc22-099aea53a590" }, "texto": {2 itens} } |
Usando o campo subject.reference, o servidor FHIR REST pode implementar um banco de dados JOIN entre o paciente e os objetos relacionados, para permitir uma pesquisa do registro do paciente que possui um plano específico com um valor de id do plano
1 |
>enrolar -X OBTER http:///Fhir/api/Patient?CarePlan.id=49b2239e-da9c-447a-9e7c-f5721339cf2f |
Pesquisar todos os pacientes que tinham um código de observação específico
1 |
>enrolar -X OBTER http:///Fhir/api/Patient?Observation.code=http://loinc.org|29463-7 |
Pesquisar todos os pacientes que tiveram uma condição médica específica
1 |
>enrolar -X OBTER http:///Fhir/api/Patient?Condition.code.text=Hypertension |
Por que o Couchbase é uma plataforma melhor para criar seu servidor FHIR
Um rápido Google sobre o FHIR Server retorna 300 mil resultados, e a página de implementação do HL7 FHIR lista mais de uma dúzia de projetos de código aberto. Implementações prontas do servidor FHIR também estão disponíveis em muitos fornecedores. Essas implementações dependem de tecnologias de banco de dados diferentes dos RDBMS tradicionais, bem como de muitos dos bancos de dados NoSQL atuais no mercado.
O dotnot-fhir-server-couchbase fornece vários exemplos de como você pode criar as especificações de pesquisa FHIR usando a plataforma Couchbase. O código traduz as APIs e os parâmetros de pesquisa da API FHIR em instruções N1QL do Couchbase e, em seguida, os envia ao serviço Couchbase Query, onde todo o processamento é feito. Essa abordagem pode reduzir a complexidade do servidor REST ou do aplicativo cliente REST. Alguns pontos importantes a serem observados:
- Os dados JSON da FHIR são armazenados no estado em que se encontram no Couchbase Data Service. Não há necessidade de pré/pós-processamento quando você precisa POST/GET o documento FHIR de/para o servidor.
- A linguagem de consulta N1QL do Couchbase tem um rico conjunto de operações que suportam o processamento dos dados hierárquicos do formato JSON do FHIR. Permitindo acesso contínuo a uma matriz aninhada de dados, como os usados para descrever as condições, as observações, os tratamentos e os relatórios de diagnóstico do paciente.
- Os requisitos da FHIR para pesquisa de texto podem ser atendidos diretamente no Couchbase Full Text Search com Pesquisa N1QL() não há necessidade de mapear suas pesquisas para Lucene, ElasticSearch ou Solr.
- As especificações de pesquisa encadeada do FHIR podem exigir que uma implementação do servidor FHIR envie várias pesquisas para o banco de dados a fim de processar a solicitação. No entanto, com o N1QL, uma consulta de junção ANSI pode resultar em um código muito mais simples para atender ao requisito.
Resumo
Os servidores FHIR Rest estão sendo implementados em todos os tipos de plataformas. Os protocolos de pesquisa são relativamente simples, concentrando-se no suporte à recuperação de pacientes e outros objetos relacionados ao FHIR por seus atributos específicos. As APIs de pesquisa isolam o cliente REST do processamento complexo de hierarquia e matriz, que são fundamentais para o formato de dados JSON. No entanto, a especificação, em sua forma atual, é a seguinte
- Não define uma maneira clara de permitir a consulta de pacientes (ou outros objetos FHIR) por suas informações relacionadas, além de um recurso simples de pai e filho.
- Não há suporte para agregação, o que limita os recursos de análise.
Devido a essas limitações, os aplicativos clientes REST podem se tornar mais complexos, pois precisam incorporar a lógica de percorrer o modelo de dados FHIR. O exemplo de código da API do servidor REST neste artigo do blog procura ilustrar três pontos principais
- A simplicidade da implementação da pesquisa em elementos de matriz usando a construção de matriz N1QL do Couchbase.
- A capacidade de fazer push para o serviço Couchbase Query, para realizar a pesquisa nos objetos do paciente usando objetos relacionados. De fato, aproveitando os suportes N1QL ANSI JOIN.
- A capacidade de integrar perfeitamente os recursos de pesquisa de texto completo com o Couchbase N1QL, sem a necessidade de usar plataformas FTS dedicadas, como o ElasticSearch ou o Solr, conforme sugerido na especificação do FHIR Search.
Também gostaria de agradecer a Arun Vijayraghavan, nosso principal gerente de produtos para todos os SDKs do Couchbase, que desenvolveu o dotnet-fhir-server-couchbase e o feedback dos clientes que ajudaram a revisar nossa implementação de pesquisa FHIR. Entre em contato conosco se tiver alguma dúvida, feedback ou se tiver algum problema ao configurar o ambiente.
Recursos
- Recurso rápido de interoperabilidade na área de saúde: https://www.hl7.org/fhir/index.html
- SyntheticMass: "Jason Walonoski, Mark Kramer, Joseph Nichols, Andre Quina, Chris Moesel, Dylan Hall, Carlton Duffett, Kudakwashe Dube, Thomas Gallagher, Scott McLachlan, Synthea: Uma abordagem, um método e um mecanismo de software para gerar pacientes sintéticos e o registro eletrônico de saúde sintético, Jornal da Associação Americana de Informática Médica, Volume 25, Edição 3, março de 2018, Páginas 230-238, https://doi.org/10.1093/jamia/ocx079"
- Tutorial N1QL: https://query-tutorial.couchbase.com/tutorial/#1
- Parâmetros de pesquisa FHIR: https://www.hl7.org/fhir/searchparameter-registry.html
Olá, obrigado por isso, mas não consegui baixar os dados de amostra do synthea de https://storage.googleapis.com/synthea-public/synthea_sample_data_fhir_r4_sep2019.zip
ao seguir este : https://github.com/AV25242/dotnet-fhir-server-couchbase.git.
Alguma ideia de como posso obter os dados de amostra?
Oi loalu - O arquivo pode ter sido movido. Mas você ainda pode encontrá-lo no site da SyntheticMass. https://synthetichealth.github.io/synthea-sample-data/downloads/synthea_sample_data_fhir_r4_sep2019.zip
-binh