Esta página explica como configurar um esquema personalizado para analisar mensagens HL7v2 que não estão em conformidade com a norma HL7v2.
Se estiver a converter mensagens HL7v2 para outro formato, como FHIR ou OMOP, primeiro, tem de conseguir analisar e carregar as suas mensagens HL7v2 para um arquivo HL7v2. Use este guia para garantir que consegue analisar e carregar mensagens HL7v2 com êxito.
Vista geral
Por vezes, as suas mensagens HL7v2 podem não estar em conformidade com as normas HL7v2. Por exemplo, as suas mensagens HL7v2 podem conter segmentos que não estão incluídos na norma HL7v2 ou os segmentos podem estar desordenados. Quando tenta carregar mensagens não conformes, pode encontrar erros.
Para carregar as mensagens HL7v2 não conformes, tem de modificar o objeto ParserConfig
quando cria ou edita um arquivo HL7v2. Dentro de ParserConfig
, pode configurar a análise esquematizada com base em tipos e segmentos personalizados, determinar como são processadas as mensagens HL7v2 rejeitadas e muito mais.
Antes de configurar o ParserConfig
, leia as secções seguintes para compreender as mensagens HL7v2, as definições de tipos e as definições de grupos.
Mensagens HL7v2
Esta secção oferece uma breve vista geral da estrutura das mensagens HL7v2, que será útil ao configurar o analisador de esquemas personalizados.
As mensagens HL7v2 baseiam-se em eventos e descrevem transições de estado e atualizações parciais aos registos clínicos. Cada mensagem HL7v2 tem um tipo de mensagem que define a finalidade da mensagem. Os tipos de mensagens usam um código de três carateres e são especificados no cabeçalho do segmento principal obrigatório (MSH) da mensagem. Existem dezenas de tipos de mensagens, incluindo os seguintes:
ADT
: usado para transmitir partes dos dados de administração de pacientes de um pacienteORU
: usado para transmitir resultados de observaçãoORM
: usado para transmitir informações sobre uma encomenda
Reveja a estrutura das mensagens HL7v2, que incluem segmentos, campos, componentes e subcomponentes:
Na figura 1, as seguintes partes da mensagem HL7v2 estão etiquetadas: o segmento, o cabeçalho do segmento, os campos e os componentes.
Por predefinição, as mensagens HL7v2 usam os seguintes carateres para separar as informações. Pode substituir os delimitadores, os separadores e os terminadores de uma mensagem HL7v2 por mensagem no segmento MSH
.
Terminador de segmento:
\r
Se as suas mensagens HL7v2 usarem um separador de segmentos diferente, consulte o exemplo Terminador de segmentos personalizado e campo personalizado.
Separador de campos:
|
Separador de componentes:
^
Separador de subcomponentes:
&
Separador de repetição:
~
Carateres de escape:
\
Definições de tipos e grupos
A compreensão do analisador sintático do esquema envolve a utilização de definições de tipo e definições de grupo.
Definição do tipo
O termo "tipos" abrange o seguinte:
Tipos de segmentos HL7v2, como
MSH
(cabeçalho do segmento de mensagem),DG1
(diagnóstico) ePID
(identificação do paciente)Para ver uma lista de todos os tipos de segmentos HL7v2, consulte as definições de segmentos.
Tipos de dados HL7v2, como
ST
(dados de string),TS
(indicação de tempo) eSI
(ID da sequência)Para uma lista de todos os tipos de dados predefinidos de HL7v2, consulte Tipos de dados.
Especifica os tipos no campo name
no objeto Type
.
Os tipos usam um formato modular que consiste num segmento e nos campos, componentes e subcomponentes do segmento. As informações num objeto Type
indicam como analisar ou interpretar um segmento e
respondem a perguntas como as seguintes:
- Que campos estão no segmento?
- Quais são os tipos de dados dos campos?
O exemplo seguinte mostra a definição de tipo para um segmento ZCD
personalizado:
{ "type": { "name": "ZCD", // Segment type "fields": [ { "name": "1", "type": "ST", // Primitive string data type "minOccurs": 1, // Must occur at least once "maxOccurs": 1 // Not repeated, because it can only occur once }, { "name": "2", "type": "A", // Custom data type "minOccurs": 1 // Repeated, because maxOccurs is not defined } ] } }
Neste exemplo, o segmento ZCD
contém dois campos, denominados 1
e 2
.
O tipo de dados de 1
é ST
, que é um tipo de dados de string primitivo. O tipo de dados de 2
é A
, que é um tipo de dados personalizado.
A definição de tipo seguinte para o tipo de dados personalizado A
mostra que também contém outro tipo de dados personalizado denominado B
.
{ "type": { "name": "A", // Custom data type "fields": [ { "name": "1", "type": "ST", // Primitive string data type "minOccurs": 1, // Must occur at least once "maxOccurs": 1 // Not repeated, because it can only occur once }, { "name": "2", "type": "B", // Custom data type "minOccurs": 1, "maxOccurs": 1 } ] } }
O exemplo seguinte mostra a definição do tipo de dados personalizado B
, que tem um campo denominado 1
com o tipo de dados ST
e um campo denominado 2
que tem um tipo de dados de ST
repetido:
{ "type": { "name": "B", // Custom data type "fields": [ { "name": "1", "type": "ST", // Primitive string data type "minOccurs": 1, // Must occur at least once "maxOccurs": 1 // Not repeated, because it can only occur once }, { "name": "2", "type": "ST" "minOccurs": 1, "maxOccurs": 1 } ] } }
Com as informações sobre o segmento e os tipos de dados, pode estimar o aspeto do segmento ZCD
na mensagem HL7v2 original. Este exemplo mostra a mensagem HL7v2 com o campo A
repetido uma vez, o que é permitido porque maxOccurs
não está definido no campo A
:
ZCD|ZCD_field_1|A_field_1^B_component_1&B_component_2_repetition_1~A_field_1^B_component_1&B_component_2_repetition_2
Na figura 2, as seguintes partes da definição do tipo estão etiquetadas: o segmento, o cabeçalho do segmento, os campos, os componentes, os subcomponentes e as repetições.
Definição do grupo
Os grupos são definidos ao nível do segmento e indicam informações sobre os tipos de segmentos que podem aparecer em cada mensagem HL7v2.
Especifica grupos na matriz groups
no objeto GroupOrSegment
.
Considere o seguinte fragmento de uma estrutura de grupo para uma mensagem ADT_A01
HL7v2:
- O primeiro
segment
na matrizmembers
éMSH
(cabeçalho do segmento de mensagem), porqueMSH
é obrigatório em todas as mensagens HL7v2. Um
group
denominadoGroup 1
.Este grupo só pode ocorrer um máximo de
2
vezes e contém o segmento personalizadoZCD
.Normalmente, um
group
contém vários segmentos aninhados agrupados logicamente e outros grupos, mas, neste exemplo,Group 1
contém apenas um único segmento:ZCD
.
{ "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "minOccurs": 1, "maxOccurs": "2", "members": [ { "segment": { "type": "ZCD" } } ] } } ] } }
Com as informações sobre os grupos, pode estimar o aspeto da mensagem HL7v2 original se ZCD
ocorrer duas vezes na mensagem HL7v2, o que é permitido porque maxOccurs
em Group 1
está definido como 2
.
O resto do segmento ZCD
é desconhecido sem também conhecer a definição de tipo.
MSH|^~\&|||||20100308000000||ADT^A01|23701|1|2.3|| ZCD|ZCD_CONTENT ZCD|ZCD_CONTENT
Na figura 3, as seguintes partes da definição do grupo estão etiquetadas: o segmento e o cabeçalho do segmento.
Configure um esquema personalizado num armazenamento de HL7v2
As secções seguintes explicam os componentes de um esquema personalizado e como configurar o esquema numa loja HL7v2.
Configuração do tipo de armazenamento HL7v2
Depois de compreender a definição do tipo de uma mensagem HL7v2, pode especificar uma configuração do tipo num armazenamento HL7v2. Para especificar a configuração, adicione
uma matriz de types
e uma matriz de version
.
O exemplo seguinte mostra como especificar a configuração para os tipos apresentados na definição de tipo num armazenamento HL7v2.
Tenha em atenção que a configuração usa a matriz version
para especificar os campos mshField
e value
. Estes campos correspondem a campos e componentes no segmento MSH.
A matriz types
especificada aplica-se apenas a mensagens que tenham um segmento MSH que corresponda aos valores de mshField
e value
na matriz version
. Isto permite-lhe carregar mensagens HL7v2 com diferentes versões
para o mesmo armazenamento de HL7v2.
{ "types": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "type": [ { "name": "ZCD", // Segment type "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "A", "minOccurs": 1 } ] }, { "name": "A", // Data type "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "B", "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "B", // Data type "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "ST" } ] } ] } ] }
Configuração do grupo de armazenamentos de HL7v2
Pode usar grupos para configurar uma estrutura aninhada ao nível de uma "subscrição".
Os grupos são especificados numa matriz members
ao nível do segmento. A estrutura de um segmento é previsível e, normalmente, contém campos, componentes e subcomponentes, mas o próprio segmento pode estar em qualquer nível da mensagem HL7v2.
Tal como uma configuração de tipo, uma configuração de grupo usa um filtro version
para lhe permitir carregar mensagens HL7v2 com versões diferentes para o mesmo arquivo HL7v2.
O exemplo seguinte mostra como especificar a configuração do grupo apresentado em Definição do grupo num armazenamento HL7v2:
{ "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "maxOccurs": "2", "members": [ "segment": { "type": "ZCD" } ] } } ] } } }
Conclua a configuração do armazenamento de HL7v2
Quando combina a configuração de tipo e a configuração de grupo, pode determinar o aspeto da configuração completa do esquema personalizado na loja HL7v2. Também pode determinar que o esquema personalizado corresponde a uma mensagem HL7v2 com o seguinte aspeto:
MSH|^~\&|||||20100101000000||ADT^A01^A01|23701|1|2.3||
ZCD|ZCD_field_1|A_field_1^B_component_1&B_component_2_repetition_1~A_field_1^B_component_1&B_component_2_repetition_2
Expanda a secção seguinte para ver o esquema personalizado completo na armazenagem HL7v2 e, em seguida, continue a criar uma armazenagem HL7v2 que use o esquema personalizado:
Expandir
{ "parserConfig": { "schema": { "schemas": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "name": "ADT_A01", "members": [ { "segment": { "type": "MSH", "minOccurs": 1, "maxOccurs": 1 } }, { "group": { "name": "Group 1", "minOccurs": 1, "maxOccurs": "2", "members": [ { "segment": { "type": "ZCD" } } ] } } ] } } } ], "types": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "type": [ { "name": "ZCD", // Segment type "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "A" "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "A", // Data type "fields": [ { "name": "1", "type": "ST" "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "B" "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "B", // Data type "fields": [ { "name": "1", "type": "ST" "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "ST" "minOccurs": 1 } ] } ] } ] }, "version": "V3" } }
Crie um armazenamento HL7v2 com o esquema personalizado
Para criar um arquivo HL7v2 que use o esquema personalizado completo, conclua esta secção.
Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:
- PROJECT_ID: o ID do seu Google Cloud projeto
- LOCATION: a localização do conjunto de dados
- DATASET_ID: o conjunto de dados principal do armazenamento de HL7v2
- HL7V2_STORE_ID: o ID do armazenamento de HL7v2
Corpo JSON do pedido:
{ "parserConfig": { "schema": { "schemas": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "name": "ADT_A01", "members": [ { "segment": { "type": "MSH", "minOccurs": 1 } }, { "group": { "name": "Group 1", "minOccurs": 1, "members": [ { "segment": { "type": "ZCD" } } ] } } ] } } } ], "types": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "type": [ { "name": "ZCD", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "A", "minOccurs": 1 } ] }, { "name": "A", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "B", "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "B", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "ST", "minOccurs": 1, "maxOccurs": 1 } ] } ] } ] }, "version": "V3" } }
Para enviar o seu pedido, escolha uma destas opções:
curl
Guarde o corpo do pedido num ficheiro denominado request.json
.
Execute o seguinte comando no terminal para criar ou substituir
este ficheiro no diretório atual:
cat > request.json << 'EOF' { "parserConfig": { "schema": { "schemas": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "name": "ADT_A01", "members": [ { "segment": { "type": "MSH", "minOccurs": 1 } }, { "group": { "name": "Group 1", "minOccurs": 1, "members": [ { "segment": { "type": "ZCD" } } ] } } ] } } } ], "types": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "type": [ { "name": "ZCD", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "A", "minOccurs": 1 } ] }, { "name": "A", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "B", "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "B", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "ST", "minOccurs": 1, "maxOccurs": 1 } ] } ] } ] }, "version": "V3" } } EOF
Em seguida, execute o seguinte comando para enviar o seu pedido REST:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores?hl7V2StoreId=HL7V2_STORE_ID"
PowerShell
Guarde o corpo do pedido num ficheiro denominado request.json
.
Execute o seguinte comando no terminal para criar ou substituir
este ficheiro no diretório atual:
@' { "parserConfig": { "schema": { "schemas": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "name": "ADT_A01", "members": [ { "segment": { "type": "MSH", "minOccurs": 1 } }, { "group": { "name": "Group 1", "minOccurs": 1, "members": [ { "segment": { "type": "ZCD" } } ] } } ] } } } ], "types": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "type": [ { "name": "ZCD", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "A", "minOccurs": 1 } ] }, { "name": "A", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "B", "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "B", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "ST", "minOccurs": 1, "maxOccurs": 1 } ] } ] } ] }, "version": "V3" } } '@ | Out-File -FilePath request.json -Encoding utf8
Em seguida, execute o seguinte comando para enviar o seu pedido REST:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores?hl7V2StoreId=HL7V2_STORE_ID" | Select-Object -Expand Content
Deve receber uma resposta JSON semelhante à seguinte:
Carregar e analisar a mensagem HL7v2 através do esquema personalizado
Para carregar uma versão codificada em base64 da mensagem HL7v2, conclua esta secção.
Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:
- PROJECT_ID: o ID do seu Google Cloud projeto
- LOCATION: a localização do conjunto de dados principal
- DATASET_ID: o conjunto de dados principal do armazenamento de HL7v2
- HL7V2_STORE_ID: o ID do armazenamento de HL7v2
Corpo JSON do pedido:
{ "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } }
Para enviar o seu pedido, escolha uma destas opções:
curl
Guarde o corpo do pedido num ficheiro denominado request.json
.
Execute o seguinte comando no terminal para criar ou substituir
este ficheiro no diretório atual:
cat > request.json << 'EOF' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } EOF
Em seguida, execute o seguinte comando para enviar o seu pedido REST:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages:ingest"
PowerShell
Guarde o corpo do pedido num ficheiro denominado request.json
.
Execute o seguinte comando no terminal para criar ou substituir
este ficheiro no diretório atual:
@' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } '@ | Out-File -FilePath request.json -Encoding utf8
Em seguida, execute o seguinte comando para enviar o seu pedido REST:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages:ingest" | Select-Object -Expand Content
Deve receber uma resposta JSON semelhante à seguinte:
Determine a cardinalidade dos campos
Pode determinar a cardinalidade de um campo numa mensagem HL7v2 definindo os seguintes campos no armazenamento HL7v2:
minOccurs
: determina o número mínimo de vezes que um grupo, um segmento, um campo, um componente ou um subcomponente tem de estar presente ou ser repetido nas mensagens HL7v2 recebidasmaxOccurs
: determina o número máximo de vezes que um grupo, um segmento, um campo, um componente ou um subcomponente pode estar presente ou ser repetido em mensagens HL7v2 recebidas
Ignore elementos em falta
Defina ignoreMinOccurs
como true
se quiser que a API HL7v2 aceite todas as mensagens HL7v2 recebidas, independentemente
de haver elementos em falta. Isto significa que uma mensagem não é rejeitada se lhe faltarem grupos, segmentos, campos, componentes ou subcomponentes obrigatórios.
Se não conseguir carregar mensagens HL7v2 porque as mensagens não têm os campos obrigatórios, recomendamos que defina ignoreMinOccurs
como true
.
Tipo de campo de caráter universal
O caráter universal, *
, é um tipo especial usado para campos. A utilização de *
indica ao analisador HL7v2 que o campo deve ser analisado com base na estrutura da mensagem HL7v2. A utilização de *
em vez de um valor para um campo é útil quando não quer aplicar um tipo de dados de campo rigoroso. Desde que o conteúdo no campo siga a norma HL7v2, a Cloud Healthcare API pode analisar a mensagem HL7v2.
Por exemplo, considere a seguinte definição de tipo. O campo 2
usa um caráter
universal em vez de um tipo de dados de campo. A definição é
equivalente à primeira definição em Definição do tipo e não
requer que especifique os tipos A
e B
:
"type": { "name": "ZCD" "fields": [ { "name": "1", "type": "ST" }, { "name": "2", "type": "*" } ] }
O que se segue?
Saiba como configurar analisadores de esquemas personalizados com exemplos de analisadores de esquemas personalizados.