Current Build

Переводит компания Health Samurai . Приглашаем поучаствовать в русификации стандарта FHIR: GitHub , Email.

2.36 Ресурс Bundle - Назначение

FHIR Infrastructure Work GroupMaturity Level: 5 NormativeSecurity Category: Not Classified Compartments: Not linked to any defined compartments

Normative Candidate Note: This page is candidate normative content for R4 in the Infrastructure Package. Once normative, it will lose it's Maturity Level, and breaking changes will no longer be made.

Контейнер для коллекции ресурсов.

Одна из распространенных операций, выполняемых над ресурсами, это сборка коллекции ресурсов в одном экземпляре, содержащем контекст. В FHIR это называется "комплектацией (пакетированием - bundling)" ресурсов. Такие связки ресурсов полезны по нескольким причинам, в том числе:

  • Возвращение набора ресурсов, которые соответствуют каким-то критериям, в рамках выполнения серверной операции (см. RESTful Search)
  • Возвращение набора версий ресурсов в рамках выполнения операции history на сервере (см. History)
  • Отправка набора ресурсов в рамках обмена сообщениями (см. Обмен сообщениями)
  • Группирование автономного набора ресурсов для действия в качестве обмениваемой и сохраняемой коллекции, обладающей клинической целостностью - например клинический документ (см. Документы)
  • Создание/обновление/удаление набора ресурсов на сервере одной операцией (отдельной атомарной транзакцией) (см. Транзакции)
  • Сохранение коллекции ресурсов

Есть два способа создать коллекцию ресурсов для передачи и хранения: вложенные ресурсы и комплекты (bundles). Между ними имеется важное различие:

  • Вложенные ресурсы находятся "внутри" ресурса-контейнера - их можно интерпретировать и/или изменять только в контексте контейнера
  • Комплект (bundle) - это коллекция ресурсов, которые могут существовать независимо - например к ним также можно обращаться напрямую через RESTful API

В дополнение к этим двум техническим механизмам есть еще три административных и инфраструктурных ресурса, с помощью которых также можно группировать контент. Эти ресурсы не содержат ресурсы напрямую, а используют ссылки для указания [Reference] на сгруппированные ресурсы:

  • Ресурс List перечисляет линейную коллекцию ресурсов и предоставляет возможности по управлению этой коллекцией. Хотя конкретный экземпляр ресурса List и можно представить в виде "снимка", с точки зрения бизнес-процессов понятие "список" является динамическим: элементы добавляются и удаляются со временем. Ресурс list ссылается на другие ресурсы. Списки могут курироваться и иметь конкретное бизнес-значение.
  • Ресурс Group задает группу конкретных людей, животных, устройств и т. д., перечисляя их или описывая качества, которые имеют члены группы. Ресурс Group ссылается на другие ресурсы, возможно неявно. Группы предназначены для совершения на ними действий или наблюдений как над единым целым. Например проведение группе терапии, расчет риска для группы и т. д. Этот ресурс будет широко использоваться в общественном здравоохранении (например при описании населения, входящего в группу риска), клинических испытаниях (например при определении тестируемого водного объекта) и в аналогичных целях.
  • Ресурс Composition определяет набор медицинской информации, собранной в единый логический документ, несущий единый согласованный смысл, устанавливающий свой собственный контекст и имеющий клиническую аттестацию в отношении того, кто составил это утверждение. Ресурс Composition составляет основную структуру FHIR-документа. Полное содержание документа формируется с помощью связки (Bundle). Композиции часто ссылаются на ресурсы List в качестве составляющих отдельных разделов.

These three resources represent meaningful groupings of the resources they refer to (e.g. a discharge medication List, a Group of participants for a clinical trial, a set of resources that form a signed document), while a Bundle is merely is a container for resources used for transfer and storage. This list is not exhaustive; other resources also provde grouping functionality.

Структура

ИмяФлагиКард.ТипОписание и ограниченияdoco
.. Bundle ΣINResourceСодержит коллекцию ресурсов
+ Rule: total only when a search or history
+ Rule: entry.search only when a search
+ Rule: entry.request mandatory for batch/transaction/history, otherwise prohibited
+ Rule: entry.response mandatory for batch-response/transaction-response/history, otherwise prohibited
+ Rule: FullUrl must be unique in a bundle, or else entries with the same fullUrl must have different meta.versionId (except in history bundles)
+ Rule: A document must have an identifier with a system and a value
+ Rule: A document must have a date
+ Rule: A document must have a Composition as the first resource
+ Rule: A message must have a MessageHeader as the first resource
Элементы, определённые в прародителе: id, meta, implicitRules, language
... identifier Σ0..1IdentifierPersistent identifier for the bundle
... type Σ1..1codedocument | message | transaction | transaction-response | batch | batch-response | history | searchset | collection
BundleType (Required)
... timestamp Σ0..1instantWhen the bundle was assembled
... total ΣI0..1unsignedIntДля поиска общее количество совпадений
... link Σ0..*BackboneElementСвязи относительно данного Bundle
.... relation Σ1..1stringSee http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1
.... url Σ1..1uriДанные по ссылке для связи
... entry ΣI0..*BackboneElementЗапись в bundle - будет содержать ресурс или информацию
+ Rule: должно быть ресурсом, если только это не запрос или ответ
+ Rule: fullUrl cannot be a version specific reference
This repeating element order: For bundles of type 'document' and 'message', the first resource is special (must be Composition or MessageHeader respectively). For all bundles, the meaning of the order of entries depends on the bundle type
.... link Σ0..*see linkСсылки, связанные с этой записью
.... fullUrl Σ0..1uriURI for resource (Absolute URL server address or URI for UUID/OID)
.... resource Σ0..1ResourceРесурс в бандле
.... search ΣI0..1BackboneElementИнформация, относящаяся к поиску
..... mode Σ0..1codematch | include | outcome - why this is in the result set
SearchEntryMode (Required)
..... score Σ0..1decimalПоисковый рейтинг (от 0 до 1)
.... request ΣI0..1BackboneElementAdditional execution information (transaction/batch/history)
..... method Σ1..1codeGET | HEAD | POST | PUT | DELETE | PATCH
HTTPVerb (Required)
..... url Σ1..1uriURL for HTTP equivalent of this entry
..... ifNoneMatch Σ0..1stringДля управления актуальностью кэша
..... ifModifiedSince Σ0..1instantДля управления актуальностью кэша
..... ifMatch Σ0..1stringДля разрешения конфликтов при обновлении
..... ifNoneExist Σ0..1stringДля операций условного создания
.... response ΣI0..1BackboneElementResults of execution (transaction/batch/history)
..... status Σ1..1stringКод статуса ответа (с необязательным текстом)
..... location Σ0..1uriThe location (if the operation returns a location)
..... etag Σ0..1stringThe Etag for the resource (if relevant)
..... lastModified Σ0..1instantСерверная дата/время изменения
..... outcome Σ0..1ResourceOperationOutcome with hints and warnings (for batch/transaction)
... signature ΣTU0..1SignatureЭлектронная цифровая подпись

doco Документация по этому формату

UML-диаграмма (Legend)

Bundle (Resource)A persistent identifier for the bundle that won't change as a bundle is copied from server to serveridentifier : Identifier [0..1]Указывает назначение этого bundle - как его намереваются использоватьtype : code [1..1] « Показывает назначение бандла - как он будет использоваться. (Strength=Required)BundleType! »The date/time that the bundle was assembled - i.e. when the resources were placed in the bundletimestamp : instant [0..1]If a set of search matches, this is the total number of entries of type 'match' across all pages in the search. It does not include search.mode = 'include' or 'outcome' entries and it does not provide a count of the number of entries in the Bundletotal : unsignedInt [0..1]Электронная цифровая подпись в кодировке base64. XML DigSIg или JWTsignature : Signature [0..1]LinkA name which details the functional use for this link - see [http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1](http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1)relation : string [1..1]Данные по ссылке для связиurl : uri [1..1]EntryThe Absolute URL for the resource. The fullUrl SHALL NOT disagree with the id in the resource - i.e. if the fullUrl is not a urn:uuid, the URL shall be version-independent URL consistent with the Resource.id. The fullUrl is a version independent reference to the resource. The fullUrl element SHALL have a value except that: * fullUrl can be empty on a POST (although it does not need to when specifying a temporary id for reference in the bundle) * Results from operations might involve resources that are not identifiedfullUrl : uri [0..1]The Resource for the entry. The purpose/meaning of the resource is determined by the Bundle.typeresource : Resource [0..1]SearchПочему эта запись попала в результирующее множество - она была включена как совпадение или в соответствии с требованием _include, or to convey information or warning information about the search processmode : code [0..1] « Почему запись вошла в результирующее множество - она была включена как совпадение или по требованию _include, or to convey information or warning information about the search process. (Strength=Required)SearchEntryMode! »При поиске оценка поискового рейтинга сервером для записиscore : decimal [0..1]RequestIn a transaction or batch, this is the HTTP action to be executed for this entry. In a history bundle, this indicates the HTTP action that occurredmethod : code [1..1] « HTTP verbs (in the HTTP command line). See [HTTP rfc](https://tools.ietf.org/html/rfc7231) for details. (Strength=Required)HTTPVerb! »The URL for this entry, relative to the root (the address to which the request is posted)url : uri [1..1]Если значения ETag совпадают, будет возвращена ошибка 304 Not modified status. См. ["Условное чтение"](http.html#cread) в документации по APIifNoneMatch : string [0..1]Операция будет выполнена, только если дата последнего обновления совпадает. См. ["Условное чтение"](http.html#cread) в документации по APIifModifiedSince : instant [0..1]Выполнить операцию только в том случае, если даты последнего обновления совпадают. Более подробную информацию см. в API-разделе "Managing Resource Contention"ifMatch : string [0..1]Указывает серверу не выполнять операцию создания, если указанный ресурс уже существует. Более подробную информацию можно посмотреть в разделе ["Условное создание"](http.html#ccreate) документации по API. Это только та часть запроса в URL, которая идёт после "?" (не включая сам "?")ifNoneExist : string [0..1]ResponseКод статуса, возвращаемый в результате обработки этой записи. Статус должен начинаться с трёхзначного HTTP-кода (например 404) и может содержать стандартное HTTP-описание, ассоциированное с этим кодом статусаstatus : string [1..1]Заголовок location, созданный при выполнении этой операции, populated if the operation returns a locationlocation : uri [0..1]The Etag for the resource, if the operation for the entry produced a versioned resource (see [Resource Metadata and Versioning](http.html#versioning) and [Managing Resource Contention](http.html#concurrency))etag : string [0..1]Дата/время изменения ресурса на сервереlastModified : instant [0..1]An OperationOutcome containing hints and warnings produced as part of processing this entry in a batch or transactionoutcome : Resource [0..1]Серия связей, обеспечивающих контекст для данного bundlelink[0..*]Ряд ссылок, предоставляющих контекст для данной записиlink[0..*]Информация о процессе поиска, который привел к созданию данной записиsearch[0..1]Дополнительная информация о том, как следует обрабатывать эту запись в рамках транзакции or batch. For history, it shows how the entry was processed to create the version contained in the entryrequest[0..1]Indicates the results of processing the corresponding 'request' entry in the batch or transaction being responded to or what the results of an operation where when returning historyresponse[0..1]Запись в bundle - будет содержать либо ресурс, либо информацию о ресурсе (только транзакционные и архивные)entry[0..*]

XML-шаблон

<Bundle xmlns="http://hl7.org/fhir"> doco
 <!-- from Resource: id, meta, implicitRules, and language -->
 <identifier><!-- 0..1 Identifier Persistent identifier for the bundle --></identifier>
 <type value="[code]"/><!-- 1..1 document | message | transaction | transaction-response | batch | batch-response | history | searchset | collection -->
 <timestamp value="[instant]"/><!-- 0..1 When the bundle was assembled -->
 <total value="[unsignedInt]"/><!-- ?? 0..1 Для поиска общее количество совпадений -->
 <link>  <!-- 0..* Связи относительно данного Bundle -->
  <relation value="[string]"/><!-- 1..1 See http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1 -->
  <url value="[uri]"/><!-- 1..1 Данные по ссылке для связи -->
 </link>
 <entry>  <!-- 0..* Запись в bundle - будет содержать ресурс или информацию -->
  <link><!-- 0..* Content as for Bundle.link Ссылки, связанные с этой записью --></link>
  <fullUrl value="[uri]"/><!-- 0..1 URI for resource (Absolute URL server address or URI for UUID/OID) -->
  <resource><!-- 0..1 Resource Ресурс в бандле --></resource>
  <search>  <!-- ?? 0..1 Информация, относящаяся к поиску -->
   <mode value="[code]"/><!-- 0..1 match | include | outcome - why this is in the result set -->
   <score value="[decimal]"/><!-- 0..1 Поисковый рейтинг (от 0 до 1) -->
  </search>
  <request>  <!-- ?? 0..1 Additional execution information (transaction/batch/history) -->
   <method value="[code]"/><!-- 1..1 GET | HEAD | POST | PUT | DELETE | PATCH -->
   <url value="[uri]"/><!-- 1..1 URL for HTTP equivalent of this entry -->
   <ifNoneMatch value="[string]"/><!-- 0..1 Для управления актуальностью кэша -->
   <ifModifiedSince value="[instant]"/><!-- 0..1 Для управления актуальностью кэша -->
   <ifMatch value="[string]"/><!-- 0..1 Для разрешения конфликтов при обновлении -->
   <ifNoneExist value="[string]"/><!-- 0..1 Для операций условного создания -->
  </request>
  <response>  <!-- ?? 0..1 Results of execution (transaction/batch/history) -->
   <status value="[string]"/><!-- 1..1 Код статуса ответа (с необязательным текстом) -->
   <location value="[uri]"/><!-- 0..1 The location (if the operation returns a location) -->
   <etag value="[string]"/><!-- 0..1 The Etag for the resource (if relevant) -->
   <lastModified value="[instant]"/><!-- 0..1 Серверная дата/время изменения -->
   <outcome><!-- 0..1 Resource OperationOutcome with hints and warnings (for batch/transaction) --></outcome>
  </response>
 </entry>
 <signature><!-- 0..1 Signature Электронная цифровая подпись --></signature>
</Bundle>

JSON-шаблон

{doco
  "resourceType" : "Bundle",
  // from Resource: id, meta, implicitRules, and language
  "identifier" : { Identifier }, // Persistent identifier for the bundle
  "type" : "<code>", // R!  document | message | transaction | transaction-response | batch | batch-response | history | searchset | collection
  "timestamp" : "<instant>", // When the bundle was assembled
  "total" : "<unsignedInt>", // C? Для поиска общее количество совпадений
  "link" : [{ // Связи относительно данного Bundle
    "relation" : "<string>", // R!  See http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1
    "url" : "<uri>" // R!  Данные по ссылке для связи
  }],
  "entry" : [{ // Запись в bundle - будет содержать ресурс или информацию
    "link" : [{ Content as for Bundle.link }], // Ссылки, связанные с этой записью
    "fullUrl" : "<uri>", // URI for resource (Absolute URL server address or URI for UUID/OID)
    "resource" : { Resource }, // Ресурс в бандле
    "search" : { // C? Информация, относящаяся к поиску
      "mode" : "<code>", // match | include | outcome - why this is in the result set
      "score" : <decimal> // Поисковый рейтинг (от 0 до 1)
    },
    "request" : { // C? Additional execution information (transaction/batch/history)
      "method" : "<code>", // R!  GET | HEAD | POST | PUT | DELETE | PATCH
      "url" : "<uri>", // R!  URL for HTTP equivalent of this entry
      "ifNoneMatch" : "<string>", // Для управления актуальностью кэша
      "ifModifiedSince" : "<instant>", // Для управления актуальностью кэша
      "ifMatch" : "<string>", // Для разрешения конфликтов при обновлении
      "ifNoneExist" : "<string>" // Для операций условного создания
    },
    "response" : { // C? Results of execution (transaction/batch/history)
      "status" : "<string>", // R!  Код статуса ответа (с необязательным текстом)
      "location" : "<uri>", // The location (if the operation returns a location)
      "etag" : "<string>", // The Etag for the resource (if relevant)
      "lastModified" : "<instant>", // Серверная дата/время изменения
      "outcome" : { Resource } // OperationOutcome with hints and warnings (for batch/transaction)
    }
  }],
  "signature" : { Signature } // Электронная цифровая подпись
}

Turtle-шаблон

@prefix fhir: <http://hl7.org/fhir/> .doco


[ a fhir:Bundle;
  fhir:nodeRole fhir:treeRoot; # if this is the parser root

  # from Resource: .id, .meta, .implicitRules, and .language
  fhir:Bundle.identifier [ Identifier ]; # 0..1 Persistent identifier for the bundle
  fhir:Bundle.type [ code ]; # 1..1 document | message | transaction | transaction-response | batch | batch-response | history | searchset | collection
  fhir:Bundle.timestamp [ instant ]; # 0..1 When the bundle was assembled
  fhir:Bundle.total [ unsignedInt ]; # 0..1 Для поиска общее количество совпадений
  fhir:Bundle.link [ # 0..* Связи относительно данного Bundle
    fhir:Bundle.link.relation [ string ]; # 1..1 See http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1
    fhir:Bundle.link.url [ uri ]; # 1..1 Данные по ссылке для связи
  ], ...;
  fhir:Bundle.entry [ # 0..* Запись в bundle - будет содержать ресурс или информацию
    fhir:Bundle.entry.link [ See Bundle.link ], ... ; # 0..* Ссылки, связанные с этой записью
    fhir:Bundle.entry.fullUrl [ uri ]; # 0..1 URI for resource (Absolute URL server address or URI for UUID/OID)
    fhir:Bundle.entry.resource [ Resource ]; # 0..1 Ресурс в бандле
    fhir:Bundle.entry.search [ # 0..1 Информация, относящаяся к поиску
      fhir:Bundle.entry.search.mode [ code ]; # 0..1 match | include | outcome - why this is in the result set
      fhir:Bundle.entry.search.score [ decimal ]; # 0..1 Поисковый рейтинг (от 0 до 1)
    ];
    fhir:Bundle.entry.request [ # 0..1 Additional execution information (transaction/batch/history)
      fhir:Bundle.entry.request.method [ code ]; # 1..1 GET | HEAD | POST | PUT | DELETE | PATCH
      fhir:Bundle.entry.request.url [ uri ]; # 1..1 URL for HTTP equivalent of this entry
      fhir:Bundle.entry.request.ifNoneMatch [ string ]; # 0..1 Для управления актуальностью кэша
      fhir:Bundle.entry.request.ifModifiedSince [ instant ]; # 0..1 Для управления актуальностью кэша
      fhir:Bundle.entry.request.ifMatch [ string ]; # 0..1 Для разрешения конфликтов при обновлении
      fhir:Bundle.entry.request.ifNoneExist [ string ]; # 0..1 Для операций условного создания
    ];
    fhir:Bundle.entry.response [ # 0..1 Results of execution (transaction/batch/history)
      fhir:Bundle.entry.response.status [ string ]; # 1..1 Код статуса ответа (с необязательным текстом)
      fhir:Bundle.entry.response.location [ uri ]; # 0..1 The location (if the operation returns a location)
      fhir:Bundle.entry.response.etag [ string ]; # 0..1 The Etag for the resource (if relevant)
      fhir:Bundle.entry.response.lastModified [ instant ]; # 0..1 Серверная дата/время изменения
      fhir:Bundle.entry.response.outcome [ Resource ]; # 0..1 OperationOutcome with hints and warnings (for batch/transaction)
    ];
  ], ...;
  fhir:Bundle.signature [ Signature ]; # 0..1 Электронная цифровая подпись
]

Changes since R3

Bundle
Bundle.timestamp
  • Added Element
Bundle.entry.request.method
  • Add Codes HEAD, PATCH

See the Full Difference for further information

This analysis is available as XML or JSON.

See R3 <--> R4 Conversion Maps (status = 28 tests of which 7 fail to execute. 9 fail round-trip testing and 14 r3 resources are invalid (0 errors).)

Структура

ИмяФлагиКард.ТипОписание и ограниченияdoco
.. Bundle ΣINResourceСодержит коллекцию ресурсов
+ Rule: total only when a search or history
+ Rule: entry.search only when a search
+ Rule: entry.request mandatory for batch/transaction/history, otherwise prohibited
+ Rule: entry.response mandatory for batch-response/transaction-response/history, otherwise prohibited
+ Rule: FullUrl must be unique in a bundle, or else entries with the same fullUrl must have different meta.versionId (except in history bundles)
+ Rule: A document must have an identifier with a system and a value
+ Rule: A document must have a date
+ Rule: A document must have a Composition as the first resource
+ Rule: A message must have a MessageHeader as the first resource
Элементы, определённые в прародителе: id, meta, implicitRules, language
... identifier Σ0..1IdentifierPersistent identifier for the bundle
... type Σ1..1codedocument | message | transaction | transaction-response | batch | batch-response | history | searchset | collection
BundleType (Required)
... timestamp Σ0..1instantWhen the bundle was assembled
... total ΣI0..1unsignedIntДля поиска общее количество совпадений
... link Σ0..*BackboneElementСвязи относительно данного Bundle
.... relation Σ1..1stringSee http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1
.... url Σ1..1uriДанные по ссылке для связи
... entry ΣI0..*BackboneElementЗапись в bundle - будет содержать ресурс или информацию
+ Rule: должно быть ресурсом, если только это не запрос или ответ
+ Rule: fullUrl cannot be a version specific reference
This repeating element order: For bundles of type 'document' and 'message', the first resource is special (must be Composition or MessageHeader respectively). For all bundles, the meaning of the order of entries depends on the bundle type
.... link Σ0..*see linkСсылки, связанные с этой записью
.... fullUrl Σ0..1uriURI for resource (Absolute URL server address or URI for UUID/OID)
.... resource Σ0..1ResourceРесурс в бандле
.... search ΣI0..1BackboneElementИнформация, относящаяся к поиску
..... mode Σ0..1codematch | include | outcome - why this is in the result set
SearchEntryMode (Required)
..... score Σ0..1decimalПоисковый рейтинг (от 0 до 1)
.... request ΣI0..1BackboneElementAdditional execution information (transaction/batch/history)
..... method Σ1..1codeGET | HEAD | POST | PUT | DELETE | PATCH
HTTPVerb (Required)
..... url Σ1..1uriURL for HTTP equivalent of this entry
..... ifNoneMatch Σ0..1stringДля управления актуальностью кэша
..... ifModifiedSince Σ0..1instantДля управления актуальностью кэша
..... ifMatch Σ0..1stringДля разрешения конфликтов при обновлении
..... ifNoneExist Σ0..1stringДля операций условного создания
.... response ΣI0..1BackboneElementResults of execution (transaction/batch/history)
..... status Σ1..1stringКод статуса ответа (с необязательным текстом)
..... location Σ0..1uriThe location (if the operation returns a location)
..... etag Σ0..1stringThe Etag for the resource (if relevant)
..... lastModified Σ0..1instantСерверная дата/время изменения
..... outcome Σ0..1ResourceOperationOutcome with hints and warnings (for batch/transaction)
... signature ΣTU0..1SignatureЭлектронная цифровая подпись

doco Документация по этому формату

UML-диаграмма (Legend)

Bundle (Resource)A persistent identifier for the bundle that won't change as a bundle is copied from server to serveridentifier : Identifier [0..1]Указывает назначение этого bundle - как его намереваются использоватьtype : code [1..1] « Показывает назначение бандла - как он будет использоваться. (Strength=Required)BundleType! »The date/time that the bundle was assembled - i.e. when the resources were placed in the bundletimestamp : instant [0..1]If a set of search matches, this is the total number of entries of type 'match' across all pages in the search. It does not include search.mode = 'include' or 'outcome' entries and it does not provide a count of the number of entries in the Bundletotal : unsignedInt [0..1]Электронная цифровая подпись в кодировке base64. XML DigSIg или JWTsignature : Signature [0..1]LinkA name which details the functional use for this link - see [http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1](http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1)relation : string [1..1]Данные по ссылке для связиurl : uri [1..1]EntryThe Absolute URL for the resource. The fullUrl SHALL NOT disagree with the id in the resource - i.e. if the fullUrl is not a urn:uuid, the URL shall be version-independent URL consistent with the Resource.id. The fullUrl is a version independent reference to the resource. The fullUrl element SHALL have a value except that: * fullUrl can be empty on a POST (although it does not need to when specifying a temporary id for reference in the bundle) * Results from operations might involve resources that are not identifiedfullUrl : uri [0..1]The Resource for the entry. The purpose/meaning of the resource is determined by the Bundle.typeresource : Resource [0..1]SearchПочему эта запись попала в результирующее множество - она была включена как совпадение или в соответствии с требованием _include, or to convey information or warning information about the search processmode : code [0..1] « Почему запись вошла в результирующее множество - она была включена как совпадение или по требованию _include, or to convey information or warning information about the search process. (Strength=Required)SearchEntryMode! »При поиске оценка поискового рейтинга сервером для записиscore : decimal [0..1]RequestIn a transaction or batch, this is the HTTP action to be executed for this entry. In a history bundle, this indicates the HTTP action that occurredmethod : code [1..1] « HTTP verbs (in the HTTP command line). See [HTTP rfc](https://tools.ietf.org/html/rfc7231) for details. (Strength=Required)HTTPVerb! »The URL for this entry, relative to the root (the address to which the request is posted)url : uri [1..1]Если значения ETag совпадают, будет возвращена ошибка 304 Not modified status. См. ["Условное чтение"](http.html#cread) в документации по APIifNoneMatch : string [0..1]Операция будет выполнена, только если дата последнего обновления совпадает. См. ["Условное чтение"](http.html#cread) в документации по APIifModifiedSince : instant [0..1]Выполнить операцию только в том случае, если даты последнего обновления совпадают. Более подробную информацию см. в API-разделе "Managing Resource Contention"ifMatch : string [0..1]Указывает серверу не выполнять операцию создания, если указанный ресурс уже существует. Более подробную информацию можно посмотреть в разделе ["Условное создание"](http.html#ccreate) документации по API. Это только та часть запроса в URL, которая идёт после "?" (не включая сам "?")ifNoneExist : string [0..1]ResponseКод статуса, возвращаемый в результате обработки этой записи. Статус должен начинаться с трёхзначного HTTP-кода (например 404) и может содержать стандартное HTTP-описание, ассоциированное с этим кодом статусаstatus : string [1..1]Заголовок location, созданный при выполнении этой операции, populated if the operation returns a locationlocation : uri [0..1]The Etag for the resource, if the operation for the entry produced a versioned resource (see [Resource Metadata and Versioning](http.html#versioning) and [Managing Resource Contention](http.html#concurrency))etag : string [0..1]Дата/время изменения ресурса на сервереlastModified : instant [0..1]An OperationOutcome containing hints and warnings produced as part of processing this entry in a batch or transactionoutcome : Resource [0..1]Серия связей, обеспечивающих контекст для данного bundlelink[0..*]Ряд ссылок, предоставляющих контекст для данной записиlink[0..*]Информация о процессе поиска, который привел к созданию данной записиsearch[0..1]Дополнительная информация о том, как следует обрабатывать эту запись в рамках транзакции or batch. For history, it shows how the entry was processed to create the version contained in the entryrequest[0..1]Indicates the results of processing the corresponding 'request' entry in the batch or transaction being responded to or what the results of an operation where when returning historyresponse[0..1]Запись в bundle - будет содержать либо ресурс, либо информацию о ресурсе (только транзакционные и архивные)entry[0..*]

XML-шаблон

<Bundle xmlns="http://hl7.org/fhir"> doco
 <!-- from Resource: id, meta, implicitRules, and language -->
 <identifier><!-- 0..1 Identifier Persistent identifier for the bundle --></identifier>
 <type value="[code]"/><!-- 1..1 document | message | transaction | transaction-response | batch | batch-response | history | searchset | collection -->
 <timestamp value="[instant]"/><!-- 0..1 When the bundle was assembled -->
 <total value="[unsignedInt]"/><!-- ?? 0..1 Для поиска общее количество совпадений -->
 <link>  <!-- 0..* Связи относительно данного Bundle -->
  <relation value="[string]"/><!-- 1..1 See http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1 -->
  <url value="[uri]"/><!-- 1..1 Данные по ссылке для связи -->
 </link>
 <entry>  <!-- 0..* Запись в bundle - будет содержать ресурс или информацию -->
  <link><!-- 0..* Content as for Bundle.link Ссылки, связанные с этой записью --></link>
  <fullUrl value="[uri]"/><!-- 0..1 URI for resource (Absolute URL server address or URI for UUID/OID) -->
  <resource><!-- 0..1 Resource Ресурс в бандле --></resource>
  <search>  <!-- ?? 0..1 Информация, относящаяся к поиску -->
   <mode value="[code]"/><!-- 0..1 match | include | outcome - why this is in the result set -->
   <score value="[decimal]"/><!-- 0..1 Поисковый рейтинг (от 0 до 1) -->
  </search>
  <request>  <!-- ?? 0..1 Additional execution information (transaction/batch/history) -->
   <method value="[code]"/><!-- 1..1 GET | HEAD | POST | PUT | DELETE | PATCH -->
   <url value="[uri]"/><!-- 1..1 URL for HTTP equivalent of this entry -->
   <ifNoneMatch value="[string]"/><!-- 0..1 Для управления актуальностью кэша -->
   <ifModifiedSince value="[instant]"/><!-- 0..1 Для управления актуальностью кэша -->
   <ifMatch value="[string]"/><!-- 0..1 Для разрешения конфликтов при обновлении -->
   <ifNoneExist value="[string]"/><!-- 0..1 Для операций условного создания -->
  </request>
  <response>  <!-- ?? 0..1 Results of execution (transaction/batch/history) -->
   <status value="[string]"/><!-- 1..1 Код статуса ответа (с необязательным текстом) -->
   <location value="[uri]"/><!-- 0..1 The location (if the operation returns a location) -->
   <etag value="[string]"/><!-- 0..1 The Etag for the resource (if relevant) -->
   <lastModified value="[instant]"/><!-- 0..1 Серверная дата/время изменения -->
   <outcome><!-- 0..1 Resource OperationOutcome with hints and warnings (for batch/transaction) --></outcome>
  </response>
 </entry>
 <signature><!-- 0..1 Signature Электронная цифровая подпись --></signature>
</Bundle>

JSON-шаблон

{doco
  "resourceType" : "Bundle",
  // from Resource: id, meta, implicitRules, and language
  "identifier" : { Identifier }, // Persistent identifier for the bundle
  "type" : "<code>", // R!  document | message | transaction | transaction-response | batch | batch-response | history | searchset | collection
  "timestamp" : "<instant>", // When the bundle was assembled
  "total" : "<unsignedInt>", // C? Для поиска общее количество совпадений
  "link" : [{ // Связи относительно данного Bundle
    "relation" : "<string>", // R!  See http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1
    "url" : "<uri>" // R!  Данные по ссылке для связи
  }],
  "entry" : [{ // Запись в bundle - будет содержать ресурс или информацию
    "link" : [{ Content as for Bundle.link }], // Ссылки, связанные с этой записью
    "fullUrl" : "<uri>", // URI for resource (Absolute URL server address or URI for UUID/OID)
    "resource" : { Resource }, // Ресурс в бандле
    "search" : { // C? Информация, относящаяся к поиску
      "mode" : "<code>", // match | include | outcome - why this is in the result set
      "score" : <decimal> // Поисковый рейтинг (от 0 до 1)
    },
    "request" : { // C? Additional execution information (transaction/batch/history)
      "method" : "<code>", // R!  GET | HEAD | POST | PUT | DELETE | PATCH
      "url" : "<uri>", // R!  URL for HTTP equivalent of this entry
      "ifNoneMatch" : "<string>", // Для управления актуальностью кэша
      "ifModifiedSince" : "<instant>", // Для управления актуальностью кэша
      "ifMatch" : "<string>", // Для разрешения конфликтов при обновлении
      "ifNoneExist" : "<string>" // Для операций условного создания
    },
    "response" : { // C? Results of execution (transaction/batch/history)
      "status" : "<string>", // R!  Код статуса ответа (с необязательным текстом)
      "location" : "<uri>", // The location (if the operation returns a location)
      "etag" : "<string>", // The Etag for the resource (if relevant)
      "lastModified" : "<instant>", // Серверная дата/время изменения
      "outcome" : { Resource } // OperationOutcome with hints and warnings (for batch/transaction)
    }
  }],
  "signature" : { Signature } // Электронная цифровая подпись
}

Turtle-шаблон

@prefix fhir: <http://hl7.org/fhir/> .doco


[ a fhir:Bundle;
  fhir:nodeRole fhir:treeRoot; # if this is the parser root

  # from Resource: .id, .meta, .implicitRules, and .language
  fhir:Bundle.identifier [ Identifier ]; # 0..1 Persistent identifier for the bundle
  fhir:Bundle.type [ code ]; # 1..1 document | message | transaction | transaction-response | batch | batch-response | history | searchset | collection
  fhir:Bundle.timestamp [ instant ]; # 0..1 When the bundle was assembled
  fhir:Bundle.total [ unsignedInt ]; # 0..1 Для поиска общее количество совпадений
  fhir:Bundle.link [ # 0..* Связи относительно данного Bundle
    fhir:Bundle.link.relation [ string ]; # 1..1 See http://www.iana.org/assignments/link-relations/link-relations.xhtml#link-relations-1
    fhir:Bundle.link.url [ uri ]; # 1..1 Данные по ссылке для связи
  ], ...;
  fhir:Bundle.entry [ # 0..* Запись в bundle - будет содержать ресурс или информацию
    fhir:Bundle.entry.link [ See Bundle.link ], ... ; # 0..* Ссылки, связанные с этой записью
    fhir:Bundle.entry.fullUrl [ uri ]; # 0..1 URI for resource (Absolute URL server address or URI for UUID/OID)
    fhir:Bundle.entry.resource [ Resource ]; # 0..1 Ресурс в бандле
    fhir:Bundle.entry.search [ # 0..1 Информация, относящаяся к поиску
      fhir:Bundle.entry.search.mode [ code ]; # 0..1 match | include | outcome - why this is in the result set
      fhir:Bundle.entry.search.score [ decimal ]; # 0..1 Поисковый рейтинг (от 0 до 1)
    ];
    fhir:Bundle.entry.request [ # 0..1 Additional execution information (transaction/batch/history)
      fhir:Bundle.entry.request.method [ code ]; # 1..1 GET | HEAD | POST | PUT | DELETE | PATCH
      fhir:Bundle.entry.request.url [ uri ]; # 1..1 URL for HTTP equivalent of this entry
      fhir:Bundle.entry.request.ifNoneMatch [ string ]; # 0..1 Для управления актуальностью кэша
      fhir:Bundle.entry.request.ifModifiedSince [ instant ]; # 0..1 Для управления актуальностью кэша
      fhir:Bundle.entry.request.ifMatch [ string ]; # 0..1 Для разрешения конфликтов при обновлении
      fhir:Bundle.entry.request.ifNoneExist [ string ]; # 0..1 Для операций условного создания
    ];
    fhir:Bundle.entry.response [ # 0..1 Results of execution (transaction/batch/history)
      fhir:Bundle.entry.response.status [ string ]; # 1..1 Код статуса ответа (с необязательным текстом)
      fhir:Bundle.entry.response.location [ uri ]; # 0..1 The location (if the operation returns a location)
      fhir:Bundle.entry.response.etag [ string ]; # 0..1 The Etag for the resource (if relevant)
      fhir:Bundle.entry.response.lastModified [ instant ]; # 0..1 Серверная дата/время изменения
      fhir:Bundle.entry.response.outcome [ Resource ]; # 0..1 OperationOutcome with hints and warnings (for batch/transaction)
    ];
  ], ...;
  fhir:Bundle.signature [ Signature ]; # 0..1 Электронная цифровая подпись
]

Changes since Release 3

Bundle
Bundle.timestamp
  • Added Element
Bundle.entry.request.method
  • Add Codes HEAD, PATCH

See the Full Difference for further information

This analysis is available as XML or JSON.

See R3 <--> R4 Conversion Maps (status = 28 tests of which 7 fail to execute. 9 fail round-trip testing and 14 r3 resources are invalid (0 errors).)

 

See the Profiles & Extensions and the Альтернативные определения: Основное определение XML + JSON, XML Schema/Schematron + JSON Schema, ShEx (for Turtle) & the Анализ зависимостей

PathОписаниеТипСсылка
Bundle.type Показывает назначение бандла - как он будет использоваться.RequiredBundleType
Bundle.entry.search.mode Почему запись вошла в результирующее множество - она была включена как совпадение или по требованию _include, or to convey information or warning information about the search process.RequiredSearchEntryMode
Bundle.entry.request.method HTTP verbs (in the HTTP command line). See [HTTP rfc](https://tools.ietf.org/html/rfc7231) for details.RequiredHTTPVerb

idLevelLocationОпределениеExpression
bdl-1Rule (base)total only when a search or historytotal.empty() or (type = 'searchset') or (type = 'history')
bdl-2Rule (base)entry.search only when a searchentry.search.empty() or (type = 'searchset')
bdl-3Rule (base)entry.request mandatory for batch/transaction/history, otherwise prohibitedentry.all(request.exists() = (%resource.type = 'batch' or %resource.type = 'transaction' or %resource.type = 'history'))
bdl-4Rule (base)entry.response mandatory for batch-response/transaction-response/history, otherwise prohibitedentry.all(response.exists() = (%resource.type = 'batch-response' or %resource.type = 'transaction-response' or %resource.type = 'history'))
bdl-5Rule Bundle.entryдолжно быть ресурсом, если только это не запрос или ответresource.exists() or request.exists() or response.exists()
bdl-7Rule (base)FullUrl must be unique in a bundle, or else entries with the same fullUrl must have different meta.versionId (except in history bundles)(type = 'history') or entry.where(fullUrl.exists()).select(fullUrl&resource.meta.versionId).isDistinct()
bdl-8Rule Bundle.entryfullUrl cannot be a version specific referencefullUrl.contains('/_history/').not()
bdl-9Rule (base)A document must have an identifier with a system and a valuetype = 'document' implies (identifier.system.exists() and identifier.value.exists())
bdl-10Rule (base)A document must have a datetype = 'document' implies (meta.lastUpdated.hasValue())
bdl-11Rule (base)A document must have a Composition as the first resourcetype = 'document' implies entry.first().resource.is(Composition)
bdl-12Rule (base)A message must have a MessageHeader as the first resourcetype = 'message' implies entry.first().resource.is(MessageHeader)
  • Концептуально связка (bundle) - это список ресурсов с некоторым контекстом (называемый связями, и статус для записей)
  • Поскольку Bundle сам по себе является ресурсом, он имеет те же общие метаданные, что и все ресурсы, включая декларирование профилей, теги и метки уровня безопасности
  • Although there are not extensions on the Bundle itself, link, entry, and search/request/response can all have extensions. See Patient and Location for examples on search
  • И Bundle.link, и Bundle.entry.link определены для поддержки обеспечения дополнительного контекста при использовании бандлов (например HATEOAS ). Bundle.entry.link соответствует ссылкам, находящимся в HTTP-заголовке, если ресурс в записи (entry) был read непосредственно. Данная спецификация определяет некоторые специфические применения Bundle.link для searching и paging, однако нет для Bundle.entry.link, и нет определенной функции в транзакции - значение зависит от реализации
  • Bundles have both .id and .identifier - see Resource Identities for further information

Содержимое и правила применения ресурса Bundle зависят от типа бандла. Обратите внимание, что все типы бандлов используют для разрешения идентификаторов ресурсов метод, описанный ниже.

Бандл-документ (type = "document") состоит из серии записей (entries), первой из которых будет Composition. Каждый элемент entry ДОЛЖЕН содержать ресурс. Дополнительную информацию см. в Documents.

Пример

Бандл-сообщение (type = "message") состоит из серии записей, первой из которых идет MessageHeader. Каждый элемент entry ДОЛЖЕН содержать ресурс. Дополнительную информацию см. в Messaging.

Example Request and Response

Набор результатов поиска (type = "searchset") состоит из серии из 0 или больше записей. Каждый элемент entry ДОЛЖЕН содержать ресурс. Дополнительную информацию см. в Search.

Дополнительно можно использовать Bundle.total для возвращения общего количества ресурсов, которые соответствуют критериям поиска, просмотр которых возможен с помощью перехода по ссылке "next".

В каждом элементе entry в бандле типа searchset могут содержаться две особые порции данных, связанных с поиском:

  • search.mode: указание причины включения ресурса в результирующее множество: соответствует критериям поиска или включен, потому что другой ресурс ссылается на него (например с помощью параметра _include)
  • search.score: рейтинговая оценка поиска от сервера для этой записи. Серверам не обязательно возвращать рейтинговую оценку, но если они делают это, то 1 означает наиболее релевантную информацию, а 0 - наименее. Примечание: часто результаты поиска сортируются по рейтингу, однако клиент может указать другой порядок сортировки (см. Search Relevance)

Пример

История изменении (type = "history") состоит из серии из 0 или более записей. Каждый элемент entry ДОЛЖЕН содержать элемент request, описывающий изменение, которое было сделано, и, если метод POST или PUT, ресурс, который представляет состояние ресурса по завершении операции. Элемент response также ДОЛЖЕН присутствовать, чтобы потребители могли иметь доступ к заголовку location. Дополнительную информацию см. в History.

Дополнительно можно использовать Bundle.total для возвращения общего количества ресурсов, которые были включены в историю изменений, включая те, что можно просмотреть, следуя по ссылке "next".

Транзакция (type = "transaction") или пакет (type = "batch") состоит из серии, содержащей 0 или более записей. Каждый элемент entry ДОЛЖЕН содержать элемент request с деталями HTTP-операции, сообщающий системе, обрабатывающей эту транзакцию, что ей необходимо сделать с этой записью. Если в записи указан метод 'PUT' или 'POST', тогда entry ДОЛЖНА содержать ресурс, который будет телом HTTP-операции. Дополнительную информацию можно посмотреть в разделе Transactions

Пример

Ответ транзакции (type = "transaction-response") или ответ пакета (type="batch-response") состоит из серии, содержащей 0 или более записей: по 1 записи на каждую запись в транзакции или пакете, к которой относится этот ответ. Каждый элемент entry ДОЛЖЕН содержать элемент response с результатом выполнения HTTP-операции, выполненной сервером для этой записи.

Пример

Коллекция (type = "collection") состоит из серии из 0 или более записей. С этим типом бандла не связано никакого определенного использования относительно FHIR-спецификации. Каждый элемент entry ДОЛЖЕН содержать ресурс.

Пример

Каждая запись в пакете должна иметь полный URL, являющийся идентификатором ресурса в записи. Обратите внимание, что это не версионная ссылка на ресурс, а его идентификатор. Если ресурсу не назначен постоянный идентификатор, который может быть использован в бандле, следует использовать UUID (urn:uuid:...). Except for transactions and batches, each entry in a Bundle must have a fullUrl which is the identity of the resource in the entry. Note that this is not a versioned reference to the resource, but its identity. Where a resource is not assigned a persistent identity that can be used in the Bundle, a UUID should be used (urn:uuid:...).

For transactions and batches, entries MAY not have fullURLs when the entry.request.method = POST, and the resource has no identity. Note that even in this case, there may still be a fullURL in a transaction on a POST so that relationships between resources can be represented (see Transactions).

A given version of a resource SHALL only appear once in each Bundle. There might, however, be multiple versions of a single resource present in a single bundle. This would be expected in Bundles of type history, and also might be necessitated by closely tracking Provenance.

Note that the meaning of an unversioned reference to a resource that appears multiple times is potentially ambiguous, though processors may have additional informaton to help resolve this (e.g. change order in a history bundle).

When processing batches and transactions, it is at server discretion how to behave if multiple versions of a single resource are present.

Ресурс Bundle - это упаковочная конструкция, содержащая одну или несколько записей, являющихся другими видами ресурсов. Сами эти ресурсы в свою очередь имеют ссылки на другие ресурсы - например Observation, который ссылается на ресурс Patient. Ресурсы, на которые даются ссылки, также могут находиться в бандле. К примеру, система, создающая бандл, может включить оба ресурса Observation и Patient. Содержимое по ссылками между ресурсами не меняется из-за бандла.

В этой секции описывается метод корректного разрешения ссылок в бандле. Обратите внимание, что этот метод не определяет новую семантику; разрешение ссылок основывается на том способе, по которому работает идентифицикация ресурсов и ссылки на ресурсы.

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

Как разрешается ссылка в бандле:

  • Если ссылка не абсолютная, то сконвертировать её в абсолютный URL:
    • if the reference has the format [type]/[id], and
    • if the fullUrl for the bundle entry containing the resource is a RESTful one (see the RESTful URL regex)
      • extract the [root] from the fullUrl, and append the reference (type/id) to it
      • then try to resolve within the bundle as for a RESTful URL reference.
      • If no resolution is possible, then the reference has no defined meaning within this specification
    • else no resolution is possible and the reference has no defined meaning within this specification
  • else
    • Look for an entry with a fullUrl that matches the URI in the reference
    • if no match is found, and the URI is a URL that can be resolved (e.g. if an http: URL), try accessing it directly)

Note, in addition, that a reference may be by identifier, and if it is, and there is no URL, it may be resolved by scanning the ids in the bundle. Note also that transactions may contain conditional references that must be resolved by the server before processing the matches.

Если ссылка является версионной (относительной или абсолютной), то удалить версию из URL перед поиском соответствия с fullUrl, а затем найти соответствующую версию по Resource.meta.versionId. Note that the rules for resolving references in contained resources are the same as those for resolving resources in the resource that contains the contained resource.

If multiple matches are found, it is ambiguous which is correct. Applications MAY return an error or take some other action as they deem appropriate.

Вот пример ресурса Bundle, в котором демонстрируются эти правила.

The Bundle resource type has an end-point like all most other resources. This end-point serves the usual interactions. Bundles are treated as static resources on the /Bundle end-point (i.e. when a batch, transaction, or message is POSTed to /Bundle, it is stored as is, and the content is not processed as batch, transaction, or message - instead, they are processed like normal resource, with indexing / auditing etc. Performing a GET /Bundle/[location] will return the same resource.

The Bundle end point does have two special search parameters - composition and message, which allow for chained search into the first (special) entries in document and message resources.

Параметры поиска для этого ресурса. Также к нему применяются общие параметры. Более подробную информацию о поиске в REST, обмене сообщениями и сервисах см. в разделе Поиск.

ИмяТипОпределениеВыражениеIn Common
compositionreferenceПервый ресурс в бандле, если тип бандла "document" - это composition, и этот параметр обеспечивает доступ к поиску по его содержимомуBundle.entry[0].resource
(Composition)
identifiertokenPersistent identifier for the bundleBundle.identifier
messagereferenceПервый ресурс в бандле, если тип бандла "message" - это message header, и этот параметр обеспечивает доступ к поиску по его содержимомуBundle.entry[0].resource
(MessageHeader)
timestampdateWhen the bundle was assembledBundle.timestamp
typetokendocument | message | transaction | transaction-response | batch | batch-response | history | searchset | collectionBundle.type