Jak používat mapování CalculatedContentTemplate

Důležité

Rozhraní API služby Azure Healthcare jsou v současné době ve verzi PREVIEW. Dodatečné podmínky použití pro Microsoft Azure ve verzi Preview obsahují dodatečné právní podmínky platné pro funkce Azure, které jsou v beta verzi, verzi Preview nebo zatím nejsou veřejně dostupné.

Tip

Podívejte se na nástroj Mapovač dat konektoru IoMT pro úpravy, testování a řešení potíží s mapováním cílů zařízení a FHIR konektoru IoT. Export mapování pro nahrání do konektoru IoT v Azure Portal nebo použití s open source verzí konektoru IoT.

Tento článek popisuje, jak používat mapování CalculatedContentTemplate s šablonami mapování zařízení konektoru IoT.

CalculatedContentTemplate

Konektor IoT poskytuje šablonu obsahu založenou na výrazech, která odpovídá hledané šabloně i extrahování hodnot. Výrazy může používat buď JSONPath, nebo JmesPath. Každý výraz v šabloně může zvolit svůj vlastní jazyk výrazů.

Poznámka

Pokud jazyk výrazů není definovaný, použije se výchozí jazyk výrazů nakonfigurovaný pro šablonu. Výchozí hodnota je JSONPath, ale v případě potřeby je možné ji přepsat.

Výraz je definován takto:

<name of expression> : {
        "value" : <the expression>,
        "language": <the expression language>
    }

V následujícím příkladu je typeMatchExpression definován jako:

"templateType": "CalculatedContent",
    "template": {
        "typeName": "heartrate",
        "typeMatchExpression": {
            "value" : "$..[?(@heartRate)]",
            "language": "JsonPath"
        },
        ...
    }

Tip

Výchozí jazyk výrazů, který se použije pro šablonu mapování zařízení, je JsonPath. Pokud chcete použít JsonPath, může být zadán samotný výraz.

"templateType": "CalculatedContent",
    "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]",
        ...
    }

Výchozí jazyk výrazů, který se má použít pro šablonu, je možné explicitně nastavit pomocí defaultExpressionLanguage parametru :

"templateType": "CalculatedContent",
    "template": {
        "typeName": "heartrate",
        "defaultExpressionLanguage": "JsonPath",
        "typeMatchExpression": "$..[?(@heartRate)]",
        ...
    }

CalculatedContentTemplate umožňuje párování a extrahování hodnot ze zprávy centra událostí Azure pomocí výrazů, jak je definováno níže:

Vlastnost Popis Příklad
TypeName Typ, který se přidruží k měřením, která odpovídají šabloně heartrate
TypeMatchExpression Výraz, který se vyhodnocuje pro datovou část EventData Pokud je nalezen odpovídající JToken, šablona se považuje za shodu. Všechny pozdější výrazy se vyhodnotí pro extrahovaný token JToken, který se tady shoduje. $..[?(@heartRate)]
Výraz TimestampExpression Výraz, který extrahuje hodnotu časového razítka pro occurrenceTimeUtc měření. $.matchedToken.endDate
DeviceIdExpression Výraz, který extrahuje identifikátor zařízení. $.matchedToken.deviceId
PatientIdExpression Vyžaduje se, když je Řešení IdentityResolution v režimu vytvoření a volitelné, pokud je Řešení IdentityResolution v režimu vyhledávání. Výraz, který extrahuje identifikátor pacienta. $.matchedToken.patientId
Výraz EncounterIdExpression Volitelné: Výraz, který extrahuje identifikátor encounter. $.matchedToken.encounterId
CorrelationIdExpression Volitelné: Výraz, který extrahuje identifikátor korelace. Tento výstup lze použít k seskupení hodnot do jednoho pozorování v mapování cíle FHIR. $.matchedToken.correlationId
Hodnoty[]. Valuename Název, který se přidruží k hodnotě extrahované dalším výrazem. V šabloně mapování cíle FHIR se použila vazba na hodnotu/komponentu, která je hledanou hodnotou nebo komponentou. hr
Hodnoty[]. Výraz ValueExpression Výraz, který extrahuje hledanou hodnotu. $.matchedToken.heartRate
Hodnoty[]. Požadované Bude vyžadovat, aby datová část měla hodnotu . Pokud se nenašlo, měření se nevygeneruje a vytvoří se výjimka InvalidOperationException. true

Jazyky výrazů

Při zadávání jazyka, který se má použít pro výraz, jsou platné následující hodnoty:

Jazyk výrazů Hodnota
JSONPath JsonPath
JmesPath JmesPath

Tip

Další informace o JSONPath najdete v tématu JSONPath. CalculatedContentTemplate používá k překladu výrazů JSONPath implementaci JSON .NET.

Další informace o JmesPath najdete v tématu JmesPath. CalculatedContentTemplate používá k překladu výrazů JmesPath implementaci JmesPath .NET.

Vlastní funkce

K dispozici je také sada vlastních funkcí konektoru IoT. Tyto vlastní funkce jsou mimo funkce poskytované jako součást specifikace JmesPath. Další informace o vlastních funkcích najdete v tématu Vlastní funkce konektoru IoT.

Odpovídající token

TypeMatchExpression se vyhodnocuje proti příchozí datové části EventData. Pokud je nalezen odpovídající JToken, šablona se považuje za shodu.

Všechny pozdější výrazy se vyhodnocují s novým JTokenem. Tento nový JToken obsahuje jak původní datovou část EventData, tak extrahovaný JToken, který se tady shoduje.

Tímto způsobem jsou pro každý pozdější výraz k dispozici původní datová část a odpovídající objekt. Extrahovaný JToken bude k dispozici jako vlastnost matchedToken.

Na této příkladové zprávě:

Zpráva

{
  "Body": {
    "deviceId": "device123",
    "data": [
      {
        "systolic": "120", // Match
        "diastolic": "80", // Match 
        "date": "2021-07-13T17:29:01.061144Z"
      },
      {
        "systolic": "122", // Match
        "diastolic": "82", // Match
        "date": "2021-07-13T17:28:01.061122Z"
      }
    ]
  },
  "Properties": {},
  "SystemProperties": {}
}

Šablona

{
  "templateType": "CollectionContent",
  "template": [
    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@systolic && @diastolic)]", // Expression
        "deviceIdExpression": "$.Body.deviceId", // This accesses the attribute 'deviceId' which belongs to the original event data
        "timestampExpression": "$.matchedToken.date", 
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.systolic",
            "valueName": "systolic"
          },
          {
            "required": "true",
            "valueExpression": "$.matchedToken.diastolic",
            "valueName": "diastolic"
          }
        ]
      }
    }
  ]
}

Dvě shody se extrahují pomocí výše uvedeného výrazu a použije se k vytvoření JTokens. Pozdější výrazy se vyhodnotí pomocí následujících JTokens:

{
  "Body": {
    "deviceId": "device123",
    "data": [
      {
        "systolic": "120", 
        "diastolic": "80",
        "date": "2021-07-13T17:29:01.061144Z"
      },
      {
        "systolic": "122",
        "diastolic": "82",
        "date": "2021-07-13T17:28:01.061122Z"
      }
    ]
  },
  "Properties": {},
  "SystemProperties": {},
  "matchedToken" : {
      "systolic": "120",
      "diastolic": "80",
      "date": "2021-07-13T17:29:01.061144Z"
  }
}

And

{
  "Body": {
    "deviceId": "device123",
    "data": [
      {
        "systolic": "120",
        "diastolic": "80",
        "date": "2021-07-13T17:29:01.061144Z"
      },
      {
        "systolic": "122", 
        "diastolic": "82", 
        "date": "2021-07-13T17:28:01.061122Z"
      }
    ]
  },
  "Properties": {},
  "SystemProperties": {},
  "matchedToken" : {
      "systolic": "122",
      "diastolic": "82",
      "date": "2021-07-13T17:28:01.061122Z"
    }
  }
}

Příklady

Heart Rate

Zpráva

{
  "Body": {
    "heartRate": "78",
    "endDate": "2019-02-01T22:46:01.8750000Z",
    "deviceId": "device123"
  },
  "Properties": {},
  "SystemProperties": {}
}

Šablona

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]",
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.heartRate",
            "valueName": "hr"
          }
        ]
      }
    }

Tlak v nákrmí

Zpráva

{
    "Body": {
        "systolic": "123", // Match
        "diastolic" : "87", // Match
        "endDate": "2019-02-01T22:46:01.8750000Z",
        "deviceId": "device123"
    },
    "Properties": {},
    "SystemProperties": {}
}

Šablona

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "bloodpressure",
        "typeMatchExpression": "$..[?(@systolic && @diastolic)]", // Expression
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.systolic",
            "valueName": "systolic"
          },
          {
            "required": "true",
            "valueExpression": "$.matchedToken.diastolic",
            "valueName": "diastolic"
          }
        ]
      }
    }

Project více měření z jedné zprávy

Zpráva

{
    "Body": {
        "heartRate": "78", // Match (Template 1)
        "steps": "2", // Match (Template 2)
        "endDate": "2019-02-01T22:46:01.8750000Z",
        "deviceId": "device123"
    },
    "Properties": {},
    "SystemProperties": {}
}

Šablona 1

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]", // Expression
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.heartRate",
            "valueName": "hr"
          }
        ]
      }
    },

Šablona 2

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "stepcount",
        "typeMatchExpression": "$..[?(@steps)]", // Expression
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.steps",
            "valueName": "steps"
          }
        ]
      }
    }

Project více měření z pole ve zprávě

Zpráva

{
  "Body": [
    {
      "heartRate": "78", // Match
      "endDate": "2019-02-01T20:46:01.8750000Z",
      "deviceId": "device123"
    },
    {
      "heartRate": "81", // Match
      "endDate": "2019-02-01T21:46:01.8750000Z",
      "deviceId": "device123"
    },
    {
      "heartRate": "72", // Match
      "endDate": "2019-02-01T22:46:01.8750000Z",
      "deviceId": "device123"
    }
  ],
  "Properties": {},
  "SystemProperties": {}
}

Šablona

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]", // Expression
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.heartRate",
            "valueName": "hr"
          }
        ]
      }
    }

Project dat z odpovídajícího tokenu a původní události

Zpráva

{
  "Body": {
    "deviceId": "device123",
    "data": [
      {
        "systolic": "120", // Match
        "diastolic": "80", // Match 
        "date": "2021-07-13T17:29:01.061144Z"
      },
      {
        "systolic": "122", // Match
        "diastolic": "82", // Match
        "date": "2021-07-13T17:28:01.061122Z"
      }
    ]
  },
  "Properties": {},
  "SystemProperties": {}
}

Šablona

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@systolic && @diastolic)]", // Expression
        "deviceIdExpression": "$.Body.deviceId", // This accesses the attribute 'deviceId' which belongs to the original event data
        "timestampExpression": "$.matchedToken.date", 
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.systolic",
            "valueName": "systolic"
          },
          {
            "required": "true",
            "valueExpression": "$.matchedToken.diastolic",
            "valueName": "diastolic"
          }
        ]
      }
    }

Výběr a transformace příchozích dat

V následujícím příkladu přicházejí data o výšce v palcích nebo metrech. Chceme, aby všechna normalizovaná data výšky byla v metrech. K dosažení tohoto výsledku vytvoříme šablonu, která cílí jenom na data výšky v palcích a transformuje je na měřiče. Jiná šablona cílí na data výšky v metrech a jednoduše je ukládá tak, jak jsou.

Zpráva

{
  "Body": [
    {
      "height": "78",
      "unit": "inches", // Match (Template 1)
      "endDate": "2019-02-01T22:46:01.8750000Z",
      "deviceId": "device123"
    },
    {
      "height": "1.9304",
      "unit": "meters", // Match (Template 2)
      "endDate": "2019-02-01T23:46:01.8750000Z",
      "deviceId": "device123"
    }
  ],
  "Properties": {},
  "SystemProperties": {}
}

Šablona 1

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heightInMeters",
        "typeMatchExpression": "$..[?(@unit == 'inches')]",
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": {
              "value": "multiply(to_number(matchedToken.height), `0.0254`)", // Convert inches to meters. Notice we utilize JmesPath as that gives us access to transformation functions
              "language": "JmesPath"
            },
            "valueName": "height"
          }
        ]
      }
    }

Šablona 2

    {
      "templateType": "CalculatedContent",
      "template": {
        "typeName": "heightInMeters",
        "typeMatchExpression": "$..[?(@unit == 'meters')]",
        "deviceIdExpression": "$.matchedToken.deviceId",
        "timestampExpression": "$.matchedToken.endDate",
        "values": [
          {
            "required": "true",
            "valueExpression": "$.matchedToken.height", // Simply extract the height as it is already in meters
            "valueName": "height"
          }
        ]
      }
    }

Tip

Pomoc při řešení běžných chyb a problémů najdete v průvodci odstraňováním potíží s konektorem IoT.

Další kroky

V tomto článku jste zjistili, jak používat mapování zařízení. Informace o používání mapování cílů FHIR najdete v tématu

(FHIR®) je registrovaná ochranná známka HL7 a používá se se souhlasem HL7.