Как использовать сопоставления Калкулатедконтенттемплате

Важно!

Сейчас API-интерфейсы здравоохранения Azure находятся на этапе предварительной версии. Дополнительные условия использования Azure для предварительных версий в Microsoft Azure содержат дополнительные юридические условия, применимые к функциям Azure, которые предоставляются в бета-версии, предварительной версии или еще не выпущены в общедоступной версии по другим причинам.

Совет

Ознакомьтесь с средством сопоставления данных соединителя иомт для изменения, тестирования и устранения неполадок в сопоставлении устройств и НАзначений FHIR в соединителе IOT. Экспорт сопоставлений для отправки в соединитель IoT в портал Azure или использования с версией с открытым исходным кодом для соединителя IOT.

В этой статье описывается, как использовать сопоставления Калкулатедконтенттемплате с шаблонами сопоставления устройств для соединителя IoT.

калкулатедконтенттемплате

Соединитель IoT предоставляет шаблон содержимого на основе выражений, который соответствует нужному шаблону и извлекает значения. Выражения могут использоваться либо JSONPath, либо JmesPath. Каждое выражение в шаблоне может выбрать собственный язык выражений.

Примечание

Если язык выражений не определен, будет использоваться язык выражений по умолчанию, настроенный для шаблона. Значение по умолчанию — JSONPath, но при необходимости оно может быть перезаписано.

Выражение определяется следующим образом:

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

В приведенном ниже примере типематчекспрессион определяется следующим образом:

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

Совет

Язык выражений по умолчанию, используемый для шаблона сопоставления устройств, — JsonPath. Если вы хотите использовать JsonPath, может быть указано только выражение.

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

Язык выражений по умолчанию, используемый для шаблона, может быть явно задан с помощью defaultExpressionLanguage параметра:

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

Калкулатедконтенттемплате позволяет сопоставлять и извлекать значения из сообщения концентратора событий Azure с помощью выражений , как указано ниже:

Свойство Описание Пример
TypeName Тип, связываемый с измерениями, которые соответствуют шаблону heartrate
типематчекспрессион Выражение, которое вычисляется на основе полезных данных EventData. Если найден соответствующий JToken, шаблон считается совпадением. Все последующие выражения оцениваются по сравнению с извлеченным JToken, указанным здесь. $..[?(@heartRate)]
тиместампекспрессион Выражение для извлечения значения метки времени для Оккурренцетимеутк измерения. $.matchedToken.endDate
девицеидекспрессион Выражение для извлечения идентификатора устройства. $.matchedToken.deviceId
патиентидекспрессион Требуется , если идентитиресолутион находится в режиме создания и необязателен , когда идентитиресолутион находится в режиме поиска . Выражение для извлечения идентификатора пациента. $.matchedToken.patientId
енкаунтеридекспрессион Необязательно: выражение для извлечения идентификатора обнаружения. $.matchedToken.encounterId
коррелатионидекспрессион Необязательно: выражение для извлечения идентификатора корреляции. Эти выходные данные можно использовать для группирования значений в одно наблюдение в сопоставлениях назначения FHIR. $.matchedToken.correlationId
Values []. ValueName Имя, связываемое со значением, извлеченным следующим выражением. Используется для привязки нужного значения или компонента в шаблоне сопоставления назначения FHIR. hr
Values []. ValueExpression Выражение для извлечения нужного значения. $.matchedToken.heartRate
Values []. Обязательно Необходимо, чтобы значение присутствовало в полезных данных. Если не найдено, измерение не будет создано и будет создано исключение InvalidOperationException. true

Языки выражений

При указании языка, используемого для выражения, допустимы следующие значения:

Язык выражений Значение
JSONPath JsonPath
JmesPath JmesPath

Совет

Дополнительные сведения о JSONPath см. в разделе JSONPath. Калкулатедконтенттемплате использует реализацию JSON .NET для разрешения выражений JSONPath.

Дополнительные сведения о JmesPath см. в разделе JmesPath. Калкулатедконтенттемплате использует реализацию JmesPath .NET для разрешения выражений JmesPath.

Пользовательские функции

Также доступен набор пользовательских функций соединителя IoT. Эти пользовательские функции находятся за пределами функций, предоставляемых в составе спецификации JmesPath. Дополнительные сведения о пользовательских функциях см. в разделе пользовательские функции соединителя IOT.

Соответствующий токен

Типематчекспрессион оценивается относительно входящих полезных данных EVENTDATA. Если найден соответствующий JToken, шаблон считается совпадением.

Все последующие выражения оцениваются по новому JToken. Этот новый JToken содержит как исходные полезные данные EventData, так и извлеченные JToken, которые здесь совпадают.

Таким образом, исходные полезные данные и сопоставленный объект доступны для каждого последующего выражения. Извлеченный JToken будет доступен как свойство матчедтокен.

С учетом этого примера сообщения:

Message

{
  "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": {}
}

Шаблон

{
  "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"
          }
        ]
      }
    }
  ]
}

Два совпадения будут извлечены с помощью приведенного выше выражения и использованы для создания Жтокенс. Последующие выражения будут оцениваться с помощью следующего Жтокенс:

{
  "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"
  }
}

И

{
  "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"
    }
  }
}

Примеры

Частота сердца

Message

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

Шаблон

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

Давление крови

Message

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

Шаблон

    {
      "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 нескольких измерений из одного сообщения

Message

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

Шаблон 1

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

Шаблон 2

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

Project нескольких измерений из массива в сообщении

Message

{
  "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": {}
}

Шаблон

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

Project данных из соответствующего маркера и исходного события

Message

{
  "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": {}
}

Шаблон

    {
      "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"
          }
        ]
      }
    }

Выбор и преобразование входящих данных

В приведенном ниже примере данные высоты поступают в дюймах или метрах. Мы хотим, чтобы все данные с нормализованной высотой были в метрах. Для достижения этого результата мы создадим шаблон, который предназначен только для данных высотой в дюймах и преобразует его в измерительные приборы. Другой шаблон предназначен для данных высоты в метрах и просто сохраняет его как есть.

Message

{
  "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": {}
}

Шаблон 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"
          }
        ]
      }
    }

Шаблон 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"
          }
        ]
      }
    }

Совет

Устранение распространенных ошибок и проблем см. в статье Руководство по устранению неполадок соединителя IOT.

Дальнейшие действия

В этой статье вы узнали, как использовать сопоставления устройств. Сведения об использовании сопоставления назначений FHIR см. в разделе

(FHIR®) является охраняемым товарным знаком HL7 и используется с разрешением HL7.