Anleitung zur Verwendung eines Bookmarks

Für eine Bookmark-Funktion sollte wie folgt vorgegangen werden:

Hinweis: in den Beispielen sind die URLs verkürzt, die Beispiele müssen also in der Praxis mit einer SearchEpisode-ID und einer Manufacturer-ID ergänzt werden.

Bookmark-Erstellung:

  1. Eine Suche durchführen: …/conceptMap?_query=findDiagnoses&searchTerms=…
  2. Aufzeichnen welchen „Display“ der Benutzer ausgewählt hat, in der …/conceptMap?_query=findDiagnoses Response ist das einer der folgenden JSON-Pfade:
    1. entry[n].resource.group[0].element[0].display, wenn der Preferred Term gewählt wurde, wobei n der Index des ausgewählten Konzepts im FHIR Bundle ist
    2. entry[n].resource.group[0].element[0].target[m].display, wenn ein Synonym gewählt wurde, wobei m der Index des gewählten Synonyms ist.
  3. Das gewählte Konzept auflösen und die SCTID merken:
    1. Aufruf der ConceptMap über die entry[n].fullUrl des gewählten Eintrags (also einen …/conceptmap?_query=getCodeByElementId&elementId=… Request auslösen)
    2. Aus der Response die SCTID extrahieren (JSON-Pfad: group[2].element[0].code)
  4. Als Bookmark-Metadaten elementId, SCTID und Display speichern
    1. Anmerkung: Die elementId ändert sich bei jedem Datenupdate.

Z. B. Suche nach „influenza-like“, 1 Ergebnis, Display-Auswahl „Grippeähnliche Erkrankung“. Das ist der normale findDiagnoses, getCodeByElementId Ablauf:

GET https://csapi.ehealth.gv.at/ehealth-codierservice/api/v2/fhir/v5/conceptmap?_query=findDiagnoses&searchEpisodeId=…&searchTerms=influenza-like

{

  „resourceType“: „Bundle“,

  „type“: „searchset“,

  „total“: 1,

  „link“: [

    {

      „relation“: „self“,

      „url“: „https://csapi.ehealth.gv.at/ehealth-codierservice/api/v2/fhir/v5/conceptmap?_query=findDiagnoses&searchEpisodeId=bE_JJ7C1JbTkn0n4.rf_cP-J3wmNYNmEDGcMDuwVhFAZk0aLVDDrCKsmXqqgzDfzTjiyLfeAq_jFbDlskGySHu2uC1u3Y5Jzp1f66Fwc.TY8fRKt53UN1BSXG0a8eVg&specializationCode=-1&searchTerms=influenza-like

    }

  ],

  „entry“: [

    {

      „fullUrl“: „https://csapi.ehealth.gv.at/ehealth-codierservice/api/v2/fhir/v5/conceptmap?_query=getCodeByElementId&searchEpisodeId=bE_JJ7C1JbTkn0n4.rf_cP-J3wmNYNmEDGcMDuwVhFAZk0aLVDDrCKsmXqqgzDfzTjiyLfeAq_jFbDlskGySHu2uC1u3Y5Jzp1f66Fwc.TY8fRKt53UN1BSXG0a8eVg&specializationCode=-1&searchTerms=influenza-like&elementId=-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FmjLqtkL471nxTF2NE.jDb4G3P_8qVMRvM5MGX1Ag„,

      „resource“: {

        „resourceType“: „ConceptMap“,

        „id“: „c85dc279-c5b3-368d-9e26-d8e89a70da15“,

        „version“: „20251212-0.6.0“,

        „status“: „draft“,

        „sourceScopeUri“: „https://codierservice.ehealth.gv.at/api/v2/fhir/v5„,

        „targetScopeUri“: „https://codierservice.ehealth.gv.at/api/v2/fhir/v5„,

        „group“: [

          {

            „source“: „https://codierservice.ehealth.gv.at/api/v2/fhir/v5„,

            „target“: „https://codierservice.ehealth.gv.at/api/v2/fhir/v5„,

            „element“: [

              {

                „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FmjLqtkL471nxTF2NE.jDb4G3P_8qVMRvM5MGX1Ag“,

                „display“: „Influenza-like Illness“,

                „target“: [

                  {

                    „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FmjLqtkL471nxTF2NE.jDb4G3P_8qVMRvM5MGX1Ag“,

                    „display“: „ILI – Influenza-like Illness“,

                    „relationship“: „equivalent“

                  },

                  {

                    „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FmjLqtkL471nxTF2NE.jDb4G3P_8qVMRvM5MGX1Ag„,

                    „display“: „Grippeähnliche Erkrankung„,

                    „relationship“: „equivalent“

                  },

                  {

                    „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FmjLqtkL471nxTF2NE.jDb4G3P_8qVMRvM5MGX1Ag“,

                    „display“: „Grippeähnliche Krankheit“,

                    „relationship“: „equivalent“

                  }

                ]

              }

            ]

          }

        ]

      },

      „search“: {

        „mode“: „match“

      }

    }

  ]

}

GET https://csapi.ehealth.gv.at/ehealth-codierservice/api/v2/fhir/v5/conceptmap?_query=getCodeByElementId&searchEpisodeId=…&searchTerms=influenza-like&elementId=-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FmjLqtkL471nxTF2NE.jDb4G3P_8qVMRvM5MGX1Ag

{

  „resourceType“: „ConceptMap“,

  „version“: „20251212-0.6.0„,

  „status“: „draft“,

„sourceScopeUri“: „http://snomed.info/sct/11000234105„,

  „group“: [

    {

      „source“: „http://snomed.info/sct/11000234105„,

      „target“: „https://termgit.elga.gv.at/CodeSystem/icd-10-bmsgpk-2025„,

      „element“: [

        {

          „code“: „95891005“,

          „display“: „Influenza-like Illness“,

          „target“: [

           {

              „code“: „B34.9“,

              „display“: „Virusinfektion, nicht näher bezeichnet“,

              „relationship“: „related-to“

            }

          ]

        }

      ]

    },

    {

      „source“: „http://snomed.info/sct/11000234105„,

      „target“: „http://www.orpha.net/ontology/orphanet.owl„,

      „element“: [

        {

          „code“: „95891005“,

          „display“: „Influenza-like Illness“,

          „noMap“: true

        }

      ]

    },

    {

      „source“: „http://snomed.info/sct/11000234105„,

      „target“: „http://snomed.info/sct/11000234105„,

      „element“: [

        {

          „code“: „95891005„,

          „display“: „Influenza-like Illness“,

          „target“: [

            {

              „code“: „95891005“,

              „display“: „ILI – Influenza-like Illness“,

              „relationship“: „equivalent“

            },

            {

              „code“: „95891005“,

              „display“: „Grippeähnliche Erkrankung“,

              „relationship“: „equivalent“

            },

            {

              „code“: „95891005“,

              „display“: „Grippeähnliche Krankheit“,

              „relationship“: „equivalent“

            }

          ]

        }

      ]

    }

  ]

}

Ein aktualisierbarer Bookmark wird zumindest mit folgenden Metadaten erstellt:

{

    „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FmjLqtkL471nxTF2NE.jDb4G3P_8qVMRvM5MGX1Ag“,

    „display“: „Grippeähnliche Erkrankung“,

    „sctid“: „95891005“

}

Idealerweise aber wie folgt:

{

    „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FmjLqtkL471nxTF2NE.jDb4G3P_8qVMRvM5MGX1Ag“,

    „display“: „Grippeähnliche Erkrankung“,

    „sctid“: „95891005“,

    „version“: „20251212-0.6.0“,

    „searchTerms“: „influenza-like“

}

Bookmark-Nutzung (Überprüfung der Aktualität):

  1. Aus den gespeicherten Daten einen HEAD-Request erstellen: …/conceptmap?_query=getCodeByElementId&elementId=<element_id>&searchEpisodeId=…&searchTerms=<sctid>
    1. Response 200: Bookmark ist aktuell. Es ist nichts weiter zu tun.
    2. Response 400 (oder 410 GONE) mit OperationOutcome code: not-found: Bookmark muss überprüft/aktualisiert werden. Die elementId ist nicht mehr gültig.

Z. B. Benutzer verwendet den Bookmark, nachdem eine neues Daten-Set eingespielt wurde. Die Daten-Set Version kann „global“ mit einem Request an den /api/version/dataset Endpunkt geprüft werden, die Version des Datensets ist aber auch in jeder ConceptMap angegeben. Eine ideale Implementierung wird nach jeder getCodeByElementId-Response, die nicht mit 200 OK beantwortet wird, einen solchen Datenset-Versions-Check ausführen, und ggf. alle Bookmarks, die nicht mehr aktuell sind, obsolet markieren und entweder proaktiv oder spätestens im Zuge der nächsten Nutzung, eine Überprüfung durchführen.

Annahme: Versionswechsel auf Daten-Set-Version 20260212-0.7.0 ist erfolgt, die nunmehr obsolete elementId ist nicht mehr auflösbar, und die Überprüfung geht schief:

HEAD https://csapi.ehealth.gv.at/ehealth-codierservice/api/v2/fhir/v5/conceptmap?_query=getCodeByElementId&searchEpisodeId=…&searchTerms=95891005&elementId=-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FmjLqtkL471nxTF2NE.jDb4G3P_8qVMRvM5MGX1Ag

HTTP/1.1 410

Content-Type: application/fhir+json

{

  „resourceType“: „OperationOutcome“,

  „issue“: [

    {

      „severity“: „error“,

      „code“: „deleted„,

      „details“: {

        „text“: „This elementId has expired with data-set version 20251212-0.6.0.“

      }

    }

  ]

}

Der Fehlercode 410 GONE signalisiert einen formell korrekten Request, der allerdings nicht mehr bedienbar ist, das FHIR OperationOutcome lautet auf „deleted“.

Der Fehlercode 400 BAD REQUEST ist ebenfalls möglich, in diesem Fall lautet das OperationOutcome auf „not-found“. In beiden Fällen ist gleich vorzugehen.

HTTP/1.1 400

Content-Type: application/fhir+json

{

  „resourceType“: „OperationOutcome“,

  „issue“: [

    {

      „severity“: „error“,

      „code“: „not-found„,

      „details“: {

        „text“: „No such elementId“

      }

    }

  ]

}

Die elementId ist nicht (mehr) gültig. Der Bookmark muss aktualisiert werden.

Überprüfung/Aktualisierung von Bookmarks:

  1. Mit der SCTID des Bookmarks als Suchbegriff suchen: …/conceptMap?_query=findDiagnoses&searchTerms=<SCTID>&searchEpisodeId=…
  2. Prüfen ob in der Response der im Bookmark gespeicherte Display (exakt gleich) noch angeboten wird. Es kann in einer Response auf eine Suche per SCTID nur null (wenn die SCTID nicht vorhanden ist) oder genau eine Entry geben (da die SCTID ja ein eindeutiger Schlüssel ist). Somit können wir die Display-Werte für Preferred Term und Synonyme aus element[0] extrahieren:
    1. entry[0].resource.group[0].element[0].display
    2. entry[0].resource.group[0].element[0].target[*].display
  3. Falls einer der Display-Werte genau mit dem ursprünglich ausgewählten (und im Bookmark gespeicherten) Display übereinstimmt, kann der Bookmark automatisch aktualisiert werden:
    1. Die ElementId im Bookmark kann schlicht durch die neue (entry[0].resource.group[0].element[0].code) ersetzt werden, da die ursprünglich „gemeinte“ SCTID weiterhin vorhanden ist, und das gewählte Synonym weiterhin gleichlautend zugeordnet ist.
  4. Andernfalls sollte der Benutzer aufgefordert werden, den Bookmark zu überprüfen, dies kann auf 2 Weisen erfolgen:
    1. Die (neue) ElementId für den Bookmark wird aus der gerade ausgeführten Suche nach SCTID (Schritt 1) ermittelt, nachdem ein Display-Wert daraus durch die Benutzer:in gewählt wurde (entry[0].resource.group[0].element[0].code).
    2. Ist die Benutzer:in mit den geänderten Synonymen (derselben SCTID) nicht zufrieden, ist der Bookmark zu verwerfen und neu zu erstellen. Dabei ist wie im Punkt „Bookmark-Erstellung“ vorzugehen.
  5. Nun sollte (auch bei automatischer Aktualisierung der elementId) noch ein „getCodeByElementId“-Request mit der neuen elementId erfolgen, sodass die neue Version der ConceptMap abgerufen wird. Was ferner zu tun ist, ist applikationsspezifisch, aber z. B.
    1. können der SCTID weitere oder andere ICD-10 Mappings zugeordnet worden sein. Möglicherweise will die Benutzer:in daraufhin die Auswahl des ICD-10 Konzepts neu festlegen.
    2. können Synonyme hinzugefügt oder korrigiert worden sein. Möglicherweise will die Benutzer:in daraufhin ihren bevorzugten Begriff (und somit den gespeicherten „display“-Value des Bookmarks überprüfen oder anpassen)
    3. könnte ein Orpha-Code ergänzt worden sein. Das ist vielleicht für die Benutzer:in interessant.
    4. Können FHIR Metadaten (z. B. Version, Status der ConceptMap) geändert worden sein. Dies ist evtl. bei der Anzeige des Bookmarks (bzw. dessen Metadaten) zu berücksichtigen.

Z. B. Suche nach der im Bookmark gespeicherten SCTID, im aktualisierten Daten-Set 20260212-0.7.0:

GET https://csapi.ehealth.gv.at/ehealth-codierservice/api/v2/fhir/v5/conceptmap?_query=findDiagnoses&searchEpisodeId=…&searchTerms=95891005

{

  „resourceType“: „Bundle“,

  „type“: „searchset“,

  „total“: 1,

  „link“: [

    {

      „relation“: „self“,

      „url“: „https://csapi.ehealth.gv.at/ehealth-codierservice/api/v2/fhir/v5/conceptmap?_query=findDiagnoses&searchEpisodeId=myVmWwfcSgQearNs.dz8F4AZzX-4dWYoVIlXqPejkidtbCUY9jaEojKE_sLaMdHIEspicdIF08CjTpNLWaC7UgN2TZEzx0Ac_OhfAA6E.QPtZda3oszMYZ14F0YwDbg&specializationCode=-1&searchTerms=95891005

    }

  ],

  „entry“: [

    {

      „fullUrl“: „https://csapi.ehealth.gv.at/ehealth-codierservice/api/v2/fhir/v5/conceptmap?_query=getCodeByElementId&searchEpisodeId=myVmWwfcSgQearNs.dz8F4AZzX-4dWYoVIlXqPejkidtbCUY9jaEojKE_sLaMdHIEspicdIF08CjTpNLWaC7UgN2TZEzx0Ac_OhfAA6E.QPtZda3oszMYZ14F0YwDbg&specializationCode=-1&searchTerms=95891005&elementId=-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FqiLqtkL471nhTF2NE.W_s66ez_fhKtQJNRtscshA„,

      „resource“: {

        „resourceType“: „ConceptMap“,

        „id“: „63680c76-a1c8-3b60-bdea-f5801abc9b36“,

        „version“: „20260212-0.7.0„,

        „status“: „draft“,

        „sourceScopeUri“: „https://codierservice.ehealth.gv.at/api/v2/fhir/v5„,

        „targetScopeUri“: „https://codierservice.ehealth.gv.at/api/v2/fhir/v5„,

        „group“: [

          {

            „source“: „https://codierservice.ehealth.gv.at/api/v2/fhir/v5„,

            „target“: „https://codierservice.ehealth.gv.at/api/v2/fhir/v5„,

            „element“: [

              {

                „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FqiLqtkL471nhTF2NE.W_s66ez_fhKtQJNRtscshA“,

                „display“: „Influenza-like Illness“,

                „target“: [

                  {

                    „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FqiLqtkL471nhTF2NE.W_s66ez_fhKtQJNRtscshA“,

                    „display“: „ILI – Influenza-like Illness“,

                    „relationship“: „equivalent“

                  },

                  {

                    „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FqiLqtkL471nhTF2NE.W_s66ez_fhKtQJNRtscshA„,

                    „display“: „Grippeähnliche Erkrankung„,

                    „relationship“: „equivalent“

                  },

                  {

                    „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FqiLqtkL471nhTF2NE.W_s66ez_fhKtQJNRtscshA“,

                    „display“: „Grippeähnliche Krankheit“,

                    „relationship“: „equivalent“

                  }

                ]

              }

            ]

          }

        ]

      },

      „search“: {

        „mode“: „match“

      }

    }

  ]

}

Die Version ist erhöht, aber der exakt gleiche Display (Synonym) ist im Suchergebnis ist noch vorhanden. Daher kann der Bookmark automatisch aktualisiert werden:

{

    „code“: „-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FqiLqtkL471nhTF2NE.W_s66ez_fhKtQJNRtscshA„,

    „display“: „Grippeähnliche Erkrankung“,

    „sctid“: „95891005“,

    „version“: „20260212-0.7.0„,

   „searchTerms“: „influenza-like“,

}

Mit der neuen ElementId sollte noch die ConceptMap neu geladen werden:

GET https://csapi.ehealth.gv.at/ehealth-codierservice/api/v2/fhir/v5/conceptmap?_query=getCodeByElementId&searchEpisodeId=…&searchTerms=95891005&elementId=-6C8aDI9dwCqHOVy1KzBpSDRinEqpWQKUJVm1FqiLqtkL471nhTF2NE.W_s66ez_fhKtQJNRtscshA

In den meisten Fällen wird lediglich die Version ConceptMap entsprechend erhöht worden sein. Evtl. kann noch überprüft werden, dass die sctid unverändert ist. Bei einer Suche nach SCTID und anschließender Auflösung muss das natürlich immer der Fall sein.

Hätte aber z. B. in der neuen Version der Display-Wert „Grippeähnliche Erkrankung“ gefehlt, sollte die Benutzer:in interaktiv eingebunden werden, um das neue, bevorzugte Synonym auszuwählen, oder aber den Bookmark neu anzulegen (Achtung: dabei kann freilich auch eine andere SCTID gewählt werden).

Evtl. wäre es auch denkbar in solchen Fällen (wenn zumindest die SCTID weiterhin gefunden wird) auf den preferred Term zurückzufallen, dies sollte aber keinesfalls ohne „opt-in“ der Benutzer:in (also eine per Default deaktivierte Option) erfolgen. Kann die SCTID gar nicht wiedergefunden werden, ist ohnehin nur der Weg über eine neue Suche (mit Begriffen) möglich. Daher ist die Speicherung des originalen Suchbegriffs in den Bookmark-Metadaten empfehlenswert. Hat man diesen, kann ggf. das Suchfeld damit bereits initialisiert werden.