2022-08-25 - SLPG Meeting

2022-08-25 - SLPG Meeting

Date & Time

10:00 to 11:00 UTC Thursday 25th August 2022

Location

Zoom meeting link (password: 764978)

Goals

  • Discuss proposed updates to URI specification, including

    • Draft format of URIs for editions plus module composition

    • Draft format of URIs for language syntax and instances

  • ECL v2.2 feature proposal

  • Discuss Postcoordination guidance strategy

Attendees 

  • Chair: @Former user (Deleted)

  • Attendees: @Rob Hausam , @michael lawley , @Jeremy Rogers (Unlicensed) , @Daniel Karlsson (Unlicensed) 

  • Staff: @Anne Randorff Højen@Alejandro Lopez Osornio , @Kai Kewley 

 

Agenda and Meeting Notes

Description

Owner

Notes

Description

Owner

Notes

Welcome and agenda

All

  • Meeting room in Portugal has been booked - Sunday 25th September 5pm-6:30pm (followed by group dinner?)

  • ECL v2.0 is now available in the SNOMED International browser - https://browser.ihtsdotools.org 

  • ECL v2.1 is in now published.

  • URIs for edition plus derivates will be published if no further comments are received

  • URIS for language syntax and language instances will be published if no further comments are received.

ECL v2.2 Proposal

 

Find the leaves of a set of concepts - example use case (find the proximal set in the international core / or in the IPS) - example:

  • Example use cases

    • Proximal ancestors in a specific module: (  > |concept|  {{ C moduleId = 1234 }} ) MINUS ( > (> |concept| {{ moduleId = 1234 }}) )

      • X =   "> |concept| {{ C moduleId = 1234 }}"

    • Leaf nodes:   < |concept| MINUS (> (< |concept|))

      • X =  " < |concept| "

    • Removing any redundant concepts (ie subsumes another concept) from a set of concepts

      • ^ |ref set| MINUS (> (^ |ref set|)

        • X = " ^ |ref set| "

Find the root concepts of a set of concepts - example use case (find the proximal set in the international core / or in the IPS) - example:

  •  

    • Example use cases for 

      • Root nodes of an extension module:   (< |concept| {{ module = X}}) MINUS (< (< |concept| {{ module = X}}))

        • X =  " < |concept| "

      • Only the 'root' concepts from a set of concepts

        • ^ |ref set| MINUS (< (^ |ref set|)

          • X = " ^ |ref set| "

  • X MINUS (> X)

  • HOMEWORK - Suggest some syntax for this.

    • leaves(X) - eg

      • leaves (> |concept| {{ C moduleId = 1234 }} )

      • leaves (< |concept|)

      • leaves (^ |refset|)

      • Pros: Easy to read

      • Cons: More consistent with the long form of ECL rather than the short form

    • L(X)    - eg

      • L (> |concept| {{ C moduleId = 1234 }} )

      • L (< |concept|)

      • L (^ |refset|)

      • Pros: Easy to type

      • Cons: L could mean anything? English specific.

    • _ (X)   - eg

      • _ (> |concept| {{ C moduleId = 1234 }} )

      • _ ( < |concept|)

      • _ (^ |refset|)

    • !_

      • Pros: Looks like lowest / floor

      • Cons: No equivalent highest / top symbol

    • !<

      • Pros: Easy to type. Familiar looking syntax.

      • Cons: May be too similar to children of - confusing?

    • !!< (bottom) !!> (top)

      • Pros: Easy to type. Familiar syntax. Different enough from <! and >!

      • Cons: None that I can think of

    • ⌊ X ⌋  (bottom),  ⌈ X ⌉  (top)

      • Pros: Matches existing mathematical syntax for the Floor and Ceiling functions, which have similar meaning.

      • Cons: Could be challenging for some people to type on the keyboard

    • <!!  (bottom),  >!!  (top)

      • Pros: Easy to type. Familiar looking syntax. Won't be mistaken for children of. Both top and bottom can be represented clearly.

      • Cons: Too long? (Makes operators three characters rather than two).

Postcoordination guidance

@Former user (Deleted) 

Discuss current work on developing postcoordination guidance

Scope for SLPG?

The items below are currently on hold

ECL v2.1 - Requirement proposals

All

Potential requirements for ECL v2.1 - Discussion and brainstorming

  • Daniel's comments

  • Context supplements - e.g.

    • << 56265001 |Heart disease|  {{ + CONTEXT }} – This syntax is too general, as there is a risk of including absent finding, not-done procedure and family history

    • << 56265001 |Heart disease| {{ + CONTEXT-DEFAULT }} ? – What would this mean?

      • Brief form:

        • [[@ecl_query]] {{ + Context (Temporal = [[ @temporal_value]]}}

      • Expanded form:

        • [[ @ecl_query ]] OR  (< 243796009 |Situation with explicit context|:
                  { ( 246090004 |Associated finding| = ( [[ @ecl_query ]] ) 
                         OR |Associated procedure| = ( [[ @ecl_query ]] )
                   ( |Procedure context| = |Done| OR |Finding context| = |Known present|),
                      |Subject relationship context| = |Subject of record|,
                       |Temporal context| = [[ @temporal_value ]] } )

      • Example 1: << |Heart procedure| {{ + Context (Temporal = *) }}

        • <<  |Heart procedure| OR  (< 243796009 |Situation with explicit context|:
                  { 246090004 |Associated finding| = << 56265001 |Heart disease|,
                      |Procedure context| = |Done|,
                      |Subject relationship context| = |Subject of record|,
                       |Temporal context| = * } )

        • Example 2: (<< |Heart disease| OR << |Heart procedure| ) {{ + Context (Temporal = *) }}

          • <<  |Heart procedure| OR  (< 243796009 |Situation with explicit context|:
                    { ( 246090004 |Associated finding| = (<< |Heart disease| OR << |Heart procedure| ) 
                           OR |Associated procedure| = ( << |Heart disease| OR << |Heart procedure| ) )
                        ( |Procedure context| = |Done| OR |Finding context| = |Known present|),
                        |Subject relationship context| = |Subject of record|,
                         |Temporal context| = * } )

      • << 56265001 |Heart disease| {{ + Context (Temporal = *, FindingContext=<<|Known present| }}

        • Will return all types of heart disease, plus concepts like 394886001 |Suspected heart disease (situation)|, and 429007001 |History of cardiac arrest (situation)|

        • Expands to: 

          • << 56265001 |Heart disease| OR
              (< 243796009 |Situation with explicit context|:
                    { 246090004 |Associated finding| = << 56265001 |Heart disease| } )

    • However, you may want to exclude (or include) specific contexts - for example:

      1. To ensure that the finding was about the subject of the record (and not a family history, e.g. to exclude 429959009 |Family history of heart failure (situation)|), you could say:

        • << 56265001 |Heart disease|  {{ + CONTEXT (relationship = 410604004 |Subject of record| }}

      2. To ensure that the finding was 'Known present' (e.g. to exclude 394926003 |Heart disease excluded (situation)|), you could say:

        • << 56265001 |Heart disease|  {{ + CONTEXT (finding_context = << 410515003 |Known present| }}

      3. To ensure that the finding was about the subject of the record AND known present, you could say:

        • << 56265001 |Heart disease|  {{ + CONTEXT (relationship = 410604004 |Subject of record|, 
                                                                                                    finding_context = << 410515003 |Known present| }}

      4. ?? Is there any use case for restricting adding temporal context? (e.g. temporal != << 410513005 |In the past|)

    • Is any more syntactic sugar required? E.g.

      • {{ + CONTEXT (relationship = self, finding context = present, temporal != past) }}

      • {{ + CONTEXT (self, present, ! past) }}

    • Other ideas? Common profiles?

  • --------------------------

  • Ability to return attribute types (see proposal below)

    • [ attributes ] << 125605004 |Fracture of bone (disorder)|

    • << 125605004 |Fracture of bone (disorder)| . Attributes

    • << 125605004 |Fracture of bone (disorder)| . (<< 125605004 |Fracture of bone (disorder)| . Attributes )

    • [ attribute, value] << 125605004 |Fracture of bone (disorder)|

  • -------------------------

  • Reverse membership (see below)

    • Which reference sets "contain" the given concept(s) - e.g. 421235005 |Structure of femur|?

      • 421235005 |Structure of femur| . Refsets

      • 421235005 |Structure of femur|. Refsets [ referencedComponentId ]

      • 421235005 |Structure of femur| . Refsets [ targetComponentId ]

  • --------------------------

  • Other?

Returning Attributes

@michael lawley

  • Currently ECL expressions can match (return) concepts that are either the source or the target of a relationship triple (target is accessed via the 'reverse' notation or 'dot notation', but not the relationship type (ie attribute name) itself. 

For example, I can write: 

<< 404684003|Clinical finding| : 363698007|Finding site| = <<66019005|Limb structure| 

<< 404684003|Clinical finding| . 363698007|Finding site| 

But I can't get all the attribute names that are used by << 404684003|Clinical finding| 

  •  

    • Perhaps something like:

      • ? R.type ? (<< 404684003 |Clinical finding|)

    • This could be extended to, for example, return different values - e.g.

      • ? |Simple map refset|.|maptarget| ? (^|Simple map refset| AND < |Fracture|)

Reverse Member Of

@michael lawley

What refsets is a given concept (e.g. 421235005 |Structure of femur|) a member of?

  • Possible new notation for this:

    • ^ . 421235005 |Structure of femur|

    • ? X ? 421235005 |Structure of femur| = ^ X

Postcoordination Topics

 

  • Discuss feedback on transformation implementation

    • Resources

    • Recap of SNOMED on FHIR discussions

      • What is the functionality scope of a terminology server that supports postcoordination? For example, does it include:

        • Classifying multiple expressions in a single substrate? What are the use cases for this?

        • Assigning (local) identifiers to expressions? What are the use cases for this?

        • Autogenerating or assigning a term to an expression? What are the use cases for this?

      • Does a terminology server that supports postcoordination, include all the functions of an expression repository?

      • What is the relationship between a terminology server that supports postcoordination, and an expression repository?

    • Outstanding questions

      • What are the pros and cons of extending SCG to allow an expression as the focus of a postcoordinated expression?

        • Note: This was raised in context of a NNF generated over a postcoordinated substrate, where the proximal parent is an expression

      • Example of using expressions in focus concept

        • 125605004 |Fracture of bone|:363698007 |finding site| = 84167007 |Foot bone| )
          272741003 |Laterality| = 7771000 |Left|

        • 125605004 |Fracture of bone|:363698007 |finding site| = 84167007 |Foot bone| , 
          272741003 |Laterality| = 7771000 |Left|

      • What is the expected NNF when classifying an expression that is equivalent to a precoordinated concept? For example:

        • Expression that is equivalent to 111273006 |Acute respiratory disease|

        • 64572001 | Disease (disorder) | :
          {263502005 |Clinical course (attribute)| = 424124008 |Sudden onset AND/OR short duration (qualifier value)|}
          {363698007 |Finding site (attribute)| = 89187006 |Airway structure (body structure)|}

        • Options:

          1. 111273006 |Acute respiratory disease| :
            {263502005 |Clinical course| = 424124008 |Sudden onset AND/OR short duration|}
            {363698007 |Finding site| = 89187006 |Airway structure|}

          2. 50043002 |Disorder of respiratory system (disorder)| +
            2704003 |Acute disease (disorder)| :
            {263502005 |Clinical course| = 424124008 |Sudden onset AND/OR short duration|}
            {363698007 |Finding site| = 89187006 |Airway structure|}

          3. Other?

    • Recap of internal discussions with Content Team

      • Inter-attribute dependencies

      • Grouping rules

Dynamic Templates

 

  • Continue discussion on dynamic templates

    • Inter-attribute dependencies

      • Acute/Chronic and Inflammation - Adding a clinical course requires specializing the inflammation morphology 

        • E.g. |Pyelonephritis| : |Clinical course| = |Chronic|
          should be
          |Pyelonephritis| : |Clinical course| = |Chronic|, |Associated morphology| = |Chronic inflammation|

        • E.g. |Pyelonephritis| : |Clinical course| = |Sudden onset AND/OR short duration|
          should be
          |Pyelonephritis| : {|Clinical course| = |Sudden onset AND/OR short duration||, |Associated morphology| = |Acute inflammation|

      • Infectious Causative Agents - Adding a |causative agent| = |Domain Bacteria| or |Virus| requires adding a |Pathological process| = |Infectious process|

        • E.g. |Nephritis|: |Causative agent| = |Domain bacteria|
          should be
          |Nephritis|: |Causative agent| = |Domain bacteria|, |Pathological process| = |Infectious process|

      • Congenital and Acquired - Adding an |Occurrence| of |Congenital| to a focus concept with an abnormal morphology, requires adding a |Pathological process| of |Pathological development process|

        • E.g. |Koilonychia|: |Occurrence| = |Congenital|
          should be
          |Koilonychia|: |Occurrence| = |Congenital|, |Pathological process| = |Pathological developmental process|

      • Situations with Explicit Context 

      1. if the procedure context = |Planned|, then the temporal context should be << |Current of specified time|

        1. If the procedure context = |In progress|, then the temporal context should be << |Current|

        2. If the procedure context = |Performed| or |Done|, then the temporal context should be << |Current or past (actual)|

      • Note: for this use case (of |Procedure with explicit context|) perhaps we just recommend (or require) that the full role group is spelled out.

      • Next steps

        • Representation of the content rules

          • Who creates the complete list of rules and how?

            • What formalism?

            • Determine which are mandatory and which are optional

          • Implementation of content rules - e.g.

            • Guided data entry by pre-populating role groups in expression template based on definition of focus concepts (for design-time use, such as mapping)

            • Mandatory content rules could be added to transform process

Postcoordination Use Case Examples

All

Example 1 - Dentistry / Odontogram

  • Requires an expression template to create expressions.

  • Resulting expression still requires a transformation to make it classifiable

Example 2 - Terminology binding

  • Uses a fixed expression template to combine codes entered into separate fields

  • The procedure+laterality example still requires a transformation to make it classifiable

Example 3 - Mapping

  • Design-time activity

  • Map targets may not be able to be fully represented using concept model attributes

  • In many cases, an extension (with primitive concepts) should be recommended where there are gaps in the mapping

  • There may be some cases in which postcoordination is helpful (e.g. LOINC to SNOMED CT map)

Example 4 - Natural Language Processing

  • Usually run-time activity.

  • May require manual confirmation of coding suggestions (unless low clinical risk, eg for suggesting relevant patient records for manual review)

Postcoordination Guidance

@Former user (Deleted) , @Anne Randorff Højen , @Kai Kewley

Practical Guide to Postcoordination

Copyright © 2025, SNOMED International