The following is a straw-man proposal to aid discussion with the group. This is a limited, happy-path scenario, including expression creation and querying. Many other operations could be performed using expressions.

- SOMETHING ABOUT R4  because of our delivery timelines-

Use Case

Solution Overview



Create Expression Repository

Create Code System Supplement for Expressions

Create the CodeSystem supplement. This supplements a specific module and version of SNOMED CT. 1234007 is the identifier of the module that contains the postcoordination content.

PUT /CodeSystem/snomed-exp

{
    "resourceType": "CodeSystem",
    "url": "http://snomed.info/sct", /* This system holds (combinations of) published codes */
"version": "http://snomed.info/xsct/1234007", /* The supplement includes the unpublished content in this module */ "content": "supplement", "supplements": "http://snomed.info/sct|http://snomed.info/sct/900000000000207008/version/20220131", /* Supplements a specific module and version */
"valueSet": "http://snomed.info/xsct/1234007?fhir_vs" /* Is this correct? */
}

The PUT operation can be used to create a resource with a specific id. Using POST would generate an id.


Create Code System for Expression Identifiers

This is only needed if EHR cannot store expressions: Create a CodeSystem for expression identifiers, specifying the CodeSystem.valueSet url.

PUT /CodeSystem/snomed-exp-id

{
    "resourceType": "CodeSystem",
    "url": "http://snomed.info/snomed/exp-id/1101234",
"valueSet": "http://snomed.info/snomed/exp-id/1101234?fhir_vs"
}

Create Expression to Identifier Concept Map

Create the ConceptMap to map expressions to expression identifiers. This will be populated manually.

PUT /ConceptMap/snomed-exp-id-map

{
    "resourceType": "ConceptMap",
    "url": "http://snomed.info/snomed/exp-id-map",
    "source": {
       "sourceUri": "http://snomed.info/xsct/1234007?fhir_vs"
},
"target": {
       "targetUri": "http://snomed.info/snomed/exp-id/1101234?fhir_vs"
} }


Add Expressions to Repository

The EHR system attempts to update the CodeSystem supplement with the expression, using either classifiable-form or close-to-user form depending on what is supported by the terminology server.
Example expression in close-to-user form: 87971000 |Closed reduction of fracture of radius (procedure)| : 272741003 |Laterality (attribute)| = 7771000 |Left (qualifier value)|

Add CTU form Expression to CodeSystem Supplement

PATCH /CodeSystem/snomed-exp

{
   "concept": [{
      "code": "87971000:272741003=7771000"
  }]
}

The terminology server must perform MRCM domain-attribute and attribute-range validation. If close-to-user form is supported, then the expression should be transformed to classifiable form before MRCM validation. The terminology server may also classify the expression at this point to reduce the processing required during subsequent operations that use the hierarchy.

Use Translate to Generate an Expression Identifier

Use an algorithmic concept map to generate an SCTID for the expression. This is similar to Ontoserver's algorithmic automap strategies. A SNOMED Namespace is required for identifier generation, this is included in the map URI.
The Implementation Support Team has ideas about how to simplify the process of namespace assignment for postcoordination.

GET /ConceptMap/$translate?
  url=http://snomed.info/xsct/101101234112/pce-id-gen/1101234
  &system=http://snomed.info/xsct/1234007
  &code=87971000:272741003=7771000


Response example:

{
"resourceType": "Parameters",
"parameter": [
{
"name": "result",
"valueBoolean": true
},
{
"name": "match",
"part": [
{
"name": "source",
"valueString": "http://snomed.info/xsct/101101234112/pce-id-gen/1101234"
},
       {
"name": "equivalence",
"valueCode": "equal"
},
{
"name": "concept",
"valueCoding": {
"system": "http://snomed.info/xsct",
"code": "101101234165"
}
}
]
}
]
}


Feedback from group (moved from earlier version)


Create Map Entry from Expression to Identifier

Create a map record from expression to the generated code using PATCH.

PATCH /ConceptMap/snomed-exp-id-map

{
   "group": [{
      "source": "http://snomed.info/sct",
"sourceVersion": "http://snomed.info/xsct/1234007",
      "target": "http://snomed.info/snomed/exp-id/1101234",
"element": [
"code": "87971000:272741003=7771000",
           "target": {
"code": "101101234165",
"equivalence": "equivalent"
           }
]
   }]
}

The generated identifier "101101234165" should be used as a whole. (It contains item identifier "10", namespace "1101234", partition identifier "16", and check digit "5".)

The generated identifier, from CodeSystem "http://snomed.info/snomed/exp-id/1101234", can be stored in the EHR record. The code system is derivable from the code, within the bounds of SNOMED CT codes, because of the 16 partition identifier and the fact that the code contains the namespace.

Use Expression Repository

Lookup Expression Identifier from Expression

GET /ConceptMap/snomed-exp-id-map/$translate?
  system=http://snomed.info/xsct/1234007
  &code=87971000:272741003=7771000

This returns an equivalent match to the expression identifier and its system.

Lookup Expression from Expression Identifier

GET /ConceptMap/snomed-exp-id-map/$translate?
  reverse=true
  &system=http://snomed.info/snomed/exp-id/1101234
  &code=101101234165

This returns an equivalent match to the expression itself and its system.

Query Expression

The department would like to report on the number of closed reduction procedures performed. All codes representing this type of procedure must be fetched so that they can be matched against the EHR records.

---------------------

Previous Feedback


The terminology server will expand the ECL using the current version of the CodeSystem supplement and the precoordinated SNOMED CT Edition and the version that the supplement is dependent on. The results will contain a mixture of simple codes and expressions:

{
    "resourceType": "ValueSet",
  "url": "/ValueSet/$expand?http://example.org/snomed-pce-library?fhir_vs=ecl/<86052008",
...
  "expansion": {
        "id": "c770c558-57a3-4512-9099-a4c7e39bb618",
      "total": 23,
        "offset": 0,
        "parameter": [
            {
                "name": "version",
              "valueUri": "?"
          }
      ],
        "contains": [
            {
                "system": "http://snomed.info/sct",
                "code": "440143005",
                "display": "Closed reduction of closed nondisplaced rib fracture"
          },
            {
                "system": "http://snomed.info/sct",
                "code": "311446006",
                "display": "Closed reduction of fracture and traction"
            },
            {
                "system": "http://snomed.info/sct",
              "code": "87971000:272741003=7771000",
              "display": "Closed reduction of fracture of radius:Laterality=Left"
          }
....

The last code in the results is our expression. It includes a term generated using the expression.

Feedback