Questa pagina spiega come configurare uno schema personalizzato per analizzare i messaggi HL7v2 non conformi allo standard HL7v2.
Se stai convertendo messaggi HL7v2 in un altro formato, ad esempio FHIR o OMOP, devi prima essere in grado di analizzare e importare i messaggi HL7v2 in un archivio HL7v2. Usa questa guida per assicurarti che sia possibile analizzare e importare correttamente i messaggi HL7v2.
Panoramica
A volte, i messaggi HL7v2 potrebbero non essere conformi agli standard HL7v2. Ad esempio, i messaggi HL7v2 potrebbero contenere segmenti non inclusi nello standard HL7v2, oppure i segmenti potrebbero non essere nell'ordine corretto. Durante il tentativo di importare messaggi non conformi, potresti riscontrare errori.
Per importare i messaggi HL7v2 non conformi, è necessario
modifica ParserConfig
durante la creazione o la modifica di un archivio HL7v2. All'interno di ParserConfig
,
può configurare l'analisi schematizzata in base a tipi e segmenti personalizzati, determinare come vengono rifiutati i messaggi HL7v2
e altro ancora.
Prima di configurare ParserConfig
, leggi le sezioni seguenti per comprendere
Messaggi HL7v2, definizioni del tipo e definizioni di gruppo.
Messaggi HL7v2
Questa sezione fornisce una breve panoramica della struttura dei messaggi HL7v2, che sarà utile durante la configurazione dell'analizzatore sintattico personalizzato degli schemi.
I messaggi HL7v2 sono basati sugli eventi e descrivono le transizioni di stato aggiornamenti alle cartelle cliniche. Ogni messaggio HL7v2 ha un tipo di messaggio che definisce lo scopo del messaggio. I tipi di messaggi utilizzano un codice di tre caratteri e sono specificati nell'intestazione del segmento principale (MSH) obbligatoria del messaggio. Ci sono decine di messaggi, tra cui:
ADT
: utilizzato per trasmettere porzioni dei dati di amministrazione dei pazienti di un pazienteORU
: utilizzato per trasmettere i risultati di osservazioneORM
: utilizzato per trasmettere informazioni su un ordine
Esaminare la struttura dei messaggi HL7v2, che comprendono segmenti, campi, componenti e sottocomponenti:
Nella figura 1, sono etichettate le seguenti parti del messaggio HL7v2: il segmento, l'intestazione del segmento, i campi e i componenti.
Per impostazione predefinita, i messaggi HL7v2 utilizzano i seguenti caratteri per
informazioni separate. È possibile eseguire l'override dei delimitatori di un messaggio HL7v2,
separatori e caratteri di terminazione per singolo messaggio nel segmento MSH
.
Carattere di terminazione dei segmenti:
\r
Se i messaggi HL7v2 utilizzano un separatore di segmenti diverso, vedi l'esempio Carattere di terminazione dei segmenti personalizzato e campo personalizzato.
Separatore di campo:
|
Separatore componenti:
^
Separatore di sottocomponente:
&
Separatore di ripetizioni:
~
Caratteri di escape:
\
Definizioni di tipi e gruppi
La comprensione del parser dello schema prevede l'utilizzo di definizioni di tipo e definizioni di gruppo.
Definizione del tipo
Il termine "tipi" include quanto segue:
Tipi di segmenti HL7v2, come
MSH
(intestazione del segmento del messaggio),DG1
(diagnosi) ePID
(identificazione del paziente)Per un elenco di tutti i tipi di segmenti HL7v2, consulta Definizioni dei segmenti.
Tipi di dati HL7v2, ad esempio
ST
(dati stringa),TS
(data e ora) eSI
(ID sequenza)Per un elenco di tutti i tipi di dati predefiniti per HL7v2, vedi Tipi di dati.
Devi specificare i tipi in name
all'interno dell'oggetto Type
.
I tipi utilizzano un formato modulare composto da un segmento e dai campi, dai componenti e
i componenti secondari. Le informazioni in un oggetto Type
indicano come analizzare o interpretare un segmento e
risponde a domande come le seguenti:
- Quali campi contiene il segmento?
- Quali sono i tipi di dati dei campi?
L'esempio seguente mostra la definizione del tipo per un segmento ZCD
personalizzato:
{ "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 } ] } }
In questo esempio, il segmento ZCD
contiene due campi, denominati 1
e 2
.
Il tipo di dati per 1
è ST
, che è un tipo di dati stringa primitivo. Il tipo di dati per 2
è A
, che è un tipo di dati personalizzato.
La seguente definizione del tipo di dati personalizzati A
mostra che contiene anche
un altro tipo di dati personalizzato, denominato 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 } ] } }
L'esempio seguente mostra la definizione del tipo di dati personalizzati B
.
che include un campo denominato 1
con tipo di dati ST
e un campo denominato
2
con un tipo di dati ST
che si ripete:
{ "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 } ] } }
Conoscendo le informazioni sul segmento e sui tipi di dati, puoi stimare l'entità
ZCD
segmento nel messaggio HL7v2 originale. Questo esempio mostra
il messaggio HL7v2 con il campo A
ripetuto una volta, operazione consentita
perché maxOccurs
non è impostato nel 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
Nella figura 2, sono etichettate le seguenti parti della definizione del tipo: il segmento, l'intestazione del segmento, i campi, i componenti, i sottocomponenti e le ripetizioni.
Definizione del gruppo
I gruppi sono definiti a livello di segmento e forniscono informazioni su cosa tipi di segmenti possono apparire in ogni messaggio HL7v2.
Devi specificare i gruppi in groups
all'interno di GroupOrSegment
.
Considera il seguente snippet di una struttura di gruppi per un messaggio HL7v2 ADT_A01
:
- Il primo
segment
nell'arraymembers
èMSH
(intestazione del segmento del messaggio), perchéMSH
è richiesto in ogni messaggio HL7v2. Un
group
denominatoGroup 1
.Questo gruppo può verificarsi al massimo
2
volte e contiene i termini segmentoZCD
personalizzato.In genere, un
group
contiene più gruppi raggruppati logicamente segmenti nidificati e altri gruppi, ma in questo esempioGroup 1
contiene solo un unico segmento:ZCD
.
{ "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "minOccurs": 1, "maxOccurs": "2", "members": [ { "segment": { "type": "ZCD" } } ] } } ] } }
Conoscendo le informazioni dei gruppi, puoi stimare cosa
il messaggio HL7v2 originale appare come se ZCD
si verifica due volte nel messaggio HL7v2,
cosa che è consentita perché maxOccurs
su Group 1
è impostato su 2
.
Il resto del segmento ZCD
è sconosciuto senza conoscere anche il
definizione del tipo.
MSH|^~\&|||||20100308000000||ADT^A01|23701|1|2.3|| ZCD|ZCD_CONTENT ZCD|ZCD_CONTENT
Nella Figura 3, sono etichettate le seguenti parti della definizione di gruppo: il segmento e l'intestazione del segmento.
configura uno schema personalizzato su un archivio HL7v2
Le seguenti sezioni spiegano i componenti di uno schema personalizzato e come e configurare lo schema su un archivio HL7v2.
Configurazione del tipo di archivio HL7v2
Dopo aver compreso la definizione del tipo di un messaggio HL7v2, puoi specificare
su un archivio HL7v2. Per specificare la configurazione, aggiungi
un array di types
e un array version
.
L'esempio seguente mostra come specificare la configurazione per i tipi mostrata in Definizione del tipo su un archivio HL7v2.
Tieni presente che la configurazione utilizza l'array version
per
specificare i campi mshField
e value
. Questi
corrispondono a campi e componenti del segmento MSH.
L'array types
specificato si applica solo ai messaggi con un
Segmento MSH che corrisponde ai valori di mshField
e value
nella
Array version
. Questo consente di importare messaggi HL7v2 con versioni diverse
nello stesso archivio 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" } ] } ] } ] }
Configurazione del gruppo di archivi HL7v2
Puoi utilizzare i gruppi per configurare una struttura nidificata a livello di "appartenenza".
I gruppi sono specificati in un
members
a livello di segmento. La struttura di un segmento è prevedibile e di solito
contiene campi, componenti e sottocomponenti, ma il segmento stesso può trovarsi
a qualsiasi livello del messaggio HL7v2.
Come una configurazione di tipo, una configurazione di gruppo utilizza
un filtro version
per consentire di importare messaggi HL7v2 con versioni diverse nello stesso archivio HL7v2.
L'esempio seguente mostra come specificare la configurazione per il gruppo mostrata in Definizione del gruppo su un archivio HL7v2:
{ "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "maxOccurs": "2", "members": [ "segment": { "type": "ZCD" } ] } } ] } } }
Completa la configurazione dell'archivio HL7v2
Quando combini la configurazione di type e il group configurazione completa dello schema personalizzato, sull'archivio HL7v2. Puoi anche determinare che lo schema personalizzato corrisponde a un messaggio HL7v2 simile al seguente:
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
Espandi la sezione seguente per vedere lo schema personalizzato completo nella HL7v2 archivia quindi continua a creare un archivio HL7v2 che utilizza lo schema personalizzato:
Espandi
{ "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" } }
Crea un archivio HL7v2 con lo schema personalizzato
Per creare un archivio HL7v2 che utilizza l'istruzione uno schema personalizzato, completa questa sezione.
Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:
- PROJECT_ID: l'ID del tuo progetto Google Cloud
- LOCATION: la posizione del set di dati
- DATASET_ID: set di dati padre dell'archivio HL7v2
- HL7V2_STORE_ID: l'ID store HL7v2
Corpo JSON della richiesta:
{ "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" } }
Per inviare la richiesta, scegli una delle seguenti opzioni:
curl
Salva il corpo della richiesta in un file denominato request.json
.
Esegui questo comando nel terminale per creare o sovrascrivere
questo file nella directory corrente:
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
Quindi, esegui questo comando per inviare la richiesta 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
Salva il corpo della richiesta in un file denominato request.json
.
Esegui questo comando nel terminale per creare o sovrascrivere
questo file nella directory corrente:
@' { "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
Quindi, esegui questo comando per inviare la richiesta 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
Dovresti ricevere una risposta JSON simile alla seguente:
importa e analizza il messaggio HL7v2 utilizzando lo schema personalizzato
Per importare una versione con codifica Base64 del messaggio HL7v2, completare questa sezione.
Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:
- PROJECT_ID: l'ID del tuo progetto Google Cloud
- LOCATION: la posizione del set di dati padre
- DATASET_ID: set di dati padre dell'archivio HL7v2
- HL7V2_STORE_ID: l'ID store HL7v2
Corpo JSON della richiesta:
{ "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } }
Per inviare la richiesta, scegli una delle seguenti opzioni:
curl
Salva il corpo della richiesta in un file denominato request.json
.
Esegui questo comando nel terminale per creare o sovrascrivere
questo file nella directory corrente:
cat > request.json << 'EOF' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } EOF
Quindi, esegui questo comando per inviare la richiesta 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
Salva il corpo della richiesta in un file denominato request.json
.
Esegui questo comando nel terminale per creare o sovrascrivere
questo file nella directory corrente:
@' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } '@ | Out-File -FilePath request.json -Encoding utf8
Quindi, esegui questo comando per inviare la richiesta 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
Dovresti ricevere una risposta JSON simile alla seguente:
Determinare la cardinalità dei campi
Puoi determinare la cardinalità di un campo in un messaggio HL7v2 impostando quanto segue sull'archivio HL7v2:
minOccurs
: determina il numero minimo di volte in cui un gruppo, un segmento, un campo il componente o il sottocomponente deve essere presente o ripetuto nei messaggi HL7v2 in arrivomaxOccurs
: determina il numero massimo di volte in cui un gruppo, un segmento, un campo un componente o un sottocomponente può essere presente o ripetuto nei messaggi HL7v2 in arrivo
Ignora gli elementi mancanti
Imposta ignoreMinOccurs
a true
se desideri che l'API HL7v2 accetti tutti i messaggi HL7v2 in arrivo indipendentemente
di eventuali elementi mancanti. Ciò significa che un messaggio non verrà rifiutato
se mancano gruppi, segmenti, campi, componenti o sottocomponenti obbligatori.
Se non sei in grado di importare i messaggi HL7v2 perché
mancano campi obbligatori, ti consigliamo di impostare ignoreMinOccurs
su true
.
Tipo di campo con caratteri jolly
Il carattere jolly, *
, è un tipo speciale utilizzato per i campi. L'utilizzo di *
indica
Parser HL7v2 che il campo deve essere analizzato in base alla struttura all'interno
messaggio HL7v2. È utile utilizzare *
al posto del valore di un campo
quando non vuoi applicare
un tipo di dati con campo restrittivo. Purché
il contenuto del campo segue lo standard HL7v2, l'API Cloud Healthcare può
analizzare il messaggio HL7v2.
Ad esempio, considera la seguente definizione del tipo. Il campo 2
utilizza un valore
carattere jolly anziché un tipo di dati del campo. La definizione è
equivalente alla prima definizione della sezione Definizione del tipo e non
richiede di specificare i tipi A
e B
:
"type": { "name": "ZCD" "fields": [ { "name": "1", "type": "ST" }, { "name": "2", "type": "*" } ] }
Passaggi successivi
Scopri di più sulla configurazione di analizzatori sintattici dello schema personalizzati con gli esempi di parser dello schema personalizzato.