2026-01-22 - SLPG Meeting

2026-01-22 - SLPG Meeting

Date & Time

Thursday 22 Jan 2026

Time: 10:00 UTC

Location: 

Goals

  • Expand the use of the ECL language

  • Make ECL expansion consistent on well known FHIR Terminology Servers

  • Consider requirements for the maintenance of ECL and postcoordinated expressions

Attendees 

  • Chair: @Kai Kewley

  • Attendees: @michael lawley Linda Bird @Lauren Agnew @Kath Priest @Anne Randorff Højen

  • Apologies: 

Focus this time:

  • Late questions on ECL 2.3 spec (almost ready for publication)

    • Include wildcard for active filter? This was discussed at the start of 2025 but not included in the finalisation meeting in October.

    • Review wording of focus concept “Any”/wildcard constraint given that the substrate should ideally contain inactive concepts

Agenda and Meeting Notes

Description

Owner

Notes

Welcome and agenda

All



ECL 2.3 - Late Clarification

 

Active filter wildcard - group has no issue including it. ML remembers discussing it.

KK - Check with MC.

  • MC got back to me and is happy to include this change in ECL 2.3

ECL 2.3 - Late Clarification

 

Improve docs on Any / Wildcard. Make consistent wording around substrate with inactive or not.

Meeting schedule change

 

Continue meeting at twice year Business Meetings. Pause monthly meetings until we have a big item to work on.

 

 

 

 

 

 

 

 

 

ECL 2.4 (Didn’t make it in ECL 2.3)

Dot notation for concrete values

@Alejandro Lopez Osornio 

Use case:

  • Get the strength value from a drug

  • Get the range of values from a set of concepts

    • User interface to pick substance and then select one of the available strengths.

Example: 318420003 |Product containing precisely atenolol 50 milligram/1 each conventional release oral tablet (clinical drug)| . 1142135004 |Has presentation strength numerator value (attribute)|

Would return "50".

Could also be used in a user interface to filter by the available options. For example listing available drug pack sizes.

Example: (<< 781405001 |Medicinal product package (product)| : 774160008 |Contains clinical drug (attribute)| = << 318420003 |Product containing precisely atenolol 50 milligram/1 each conventional release oral tablet (clinical drug)|) . 1142142004 |Has pack size (attribute)|



TODO: Someone try implementing this.

  • Behaviour constraint - this should only be used in the top level expression - otherwise return an error

Then: Document in behaviour spec + examples @Kai Kewley 

Notes on implementation - use hierarchy to check attribute data types.

 

 

 

 

 

 

 

 

 

VCL vs ECL Core

 

User guidance needed when each is applicable or necessary:

  • VCL / ECL Core / ECL

VCL has the syntax-version number as part of the FHIR parameter.

ECL version in FHIR TX capability statement

 

Optional version-tag in SNOMED ValueSet URI?

ECL 2.3

Non Code FHIR Examples



Create notes for ECL implementers to draw attention to the fact that some ECL results are not concepts/codes.

Link to the SNOMED on FHIR documentation for this.

Consider adding an appendix for FHIR specific considerations.

TODO: Keep an eye on progress of the SNOMED on FHIR doc.

@Kai Kewley to catch up with PGW on this

ECL Test Harness



@Kai Kewley @Márk Czotter (Unlicensed) 

August 2025 Update - Kai enhanced the SNOMED Subontology Extractor for Grahame Grieve. He is adding SCT some SCT specific test cases.
See https://github.com/HL7/fhir-tx-ecosystem-ig/tree/main/tx-source

---

Next steps:

TODO: B2i have test cases that check ECL to Elasticsearch query conversion. Does the group want more integration style tests that specify a substrate and expected set of concept results?

ECL: Ensuring consistency

All

Updates following Jeremy Roger's Terminology Terver ECL consistency analysis the following changes were recommended by the group:

  • Filter changes

  • Description filter changes

    • Change ECL specification to exclude TextDefinitions by default

    • Make string “match” case insensitive

      • Done: Group agreed to exclude TextDefinitions by default.

        • TODO: Update specification for review @Kai Kewley 

    • For review 6.8 Description Filters

    • TODO: Ensure all ECL 2.3 changes, both syntax and behaviour changes, are listed in the guide.

  • Should FSN be excluded by default from Description filters?

    • Jeremy could retest to find any behaviour differences.

    • Discussion: 

      • Pros:

        • A lot of results when search term includes semantic tag word, e.g. disorder

          • Workaround: engines could use ranking to reduce the score of concepts matching by semantic tag

      • Cons:

        • Not all concepts have a synonym exactly matching the FSN minus its semantic tag .. .but the huge majority do. Only 14.6% do not, but even most of these have at least one vanilla synonym that is incredibly similar to the FSN (at least, for the language=en presentation of SNOMED). For this reason, adding the words of "FSN minus semantic tag" into the lexical search space by default almost never materially alters the lexical retrieval result, because there are enough words in the vanilla Synonyms. But adding the semantic tag itself in as well is at best redundant and at worst a source of false positive search results. If the rules and therefore benefits of including the FSN are different for searches over other languages then fine...but if that is the case then we must consider whether imposing language-blind rules and defaults on Terminology Server behaviours is a good idea. It appears to be adversely impacting anglophone search.

          Consider Rogers' Conjecture:
          If semantic tags had not been encoded within SNOMED CT in the way that they are, embedded within the string of FSNs, but had instead been encoded as either a standalone description type, or by the membership of a crefset, then we wouldn’t be dreaming of including them by default within the scope of lexical searches.

          If the words in the rest of the FSN, without the semantic tag, are presented in other synonyms anyway then, outside of very specialist terminologist use cases, there is virtually no reason to ever perform a lexical search on the FSN whether by default or for fun. If you want to constrain a search both semantically and lexically, use the taxonomy not the semantic tags for the semantic constraint element. If you just want to include the words in the FSN other than the semantic tag in your lexical search, then you've already got them in the synonyms. And if you haven't then there is probably a modelling/naming error that would be better fixed in the source data rather than compensated for post hoc by always including the FSN in searches even where it isn't needed and does more harm than good.





Resolvable URIs for ECL



@Anne Randorff Højen 

This topic is important for the implementation guides and other documentation.

The group chose to use the existing FHIR ValueSet URI, rather than adding to the SNOMED URI standard.
These can be made to resolve. They can already optionally contain an edition and optionally an edition version.

From these options:

Action: Create implementation tickets @Kai Kewley 

----





ECL 2.4 development

(Later)





@Márk Czotter (Unlicensed) 

Proposal. "exact:" case-sensitive string matching prefix.

Examples from B2i where this is more useful than wild..

Use case:

  • Identifying duplicates during upgrade of dependencies.

    • Supporting UK upgrade process, finding promotions from other NRCs 

    • Case sensitive match

    • Drug flavour codes in DM+D, e.g. "Almond"

Current term matching options:

  • {{ D term = "asth" }} equivalent to {{ D term = match:"asth" }}

  • Should we add wild - {{ D term = exact:"asthma" }}

    • Same as {{ D term = wild:"asthma" }} ?

    • No, wild is now case insensitive. Exact is case sensitive.



TODO: (2.4) Make syntax changes to add this @Kai Kewley 

ECL Future

Enhancement Request: Set of reference sets containing all concepts in a set



Archived

Find refsets containing this concept or all of these concepts

Syntax options:

  • ^[refsetId] * {{ M referencedComponentId = 1000 }} AND ^[refsetId] * {{ M referencedComponentId = 2000 }} AND ^[refsetId] * {{ M referencedComponentId = 3000 }}

  • Syntax sugar: ^R-ALL (1000 OR 2000 OR 3000)

  • New syntax: ^R-ALL (<< 404684003)

  • Alt: ^R 1000 AND ^R 2000 AND ^R 3000



2.4 ECL Enhancement

(On Hold)

@michael lawley 

I want to fetch the set of attribute names used by a concept or set of concepts.

Use case: 

  • Authoring ECL

  • Authoring template generation

Syntax options:

  • 12334000 . ?

  • 12334000 = R?

  • 12334000 : ?

  • 12334000 : ? = *

  • 12334000 : * = ?

  • 12334000 [ typeId ] (2 votes)

    • Disadvantage of this - starts to imply any column is selectable.

    • Although the behaviour is about expressions (original purpose of ECL).. the syntax starts to look like a RF2 query language.

  • 12334000.typeId

  • 12334000 ...

  • 12334000.A (1 vote)

  • 12334000.T (1 vote)

  • ( << 318420003 |Product| ).R

  • 12334000 {{ R }}

Behaviour - implied "distinct" .

ECL gramma feedback





Compound word search

@michael lawley 

@Kai Kewley 

@Feikje Hielkema (Unlicensed) 

Each language would need a list of words to find within compound words. Where could these lists come from?

  • Use words from snomed that are longer than 3 characters?

  • Allow extensions to produce list of terms

  • Add hidden unicode character in compound words to mark the word boundaries

  • How to solve for other terminologies?

DONE: Establish a test set of terms for compound word processing. List of concept terms and desirable search terms. @Feikje Hielkema (Unlicensed) 

TODO: Trial compound word splitting, preprocess using a hyphenation algo?

ECL Capability statement in FHIR



Chat with @Peter Williams 

FHIR TX - Searching with a specific dialect



@Kai Kewley  Try this in Snowstorm:

When expanding a ValueSet with text filtering it is recommended to use the "Content-Language" header, to constrain the language and dialect of matched terms, in addition to informing the selection of display terms.

This behaviour is owned by HL7.

Substrate discussion



Add appendix to describe the potential differences between terminology servers given what content is loaded/filtered out.

MRCM on FHIR

All

There is a growing desire to enable access to the SNOMED CT Machine Readable Concept Model via FHIR Terminology Servers.

Use cases:

  • To support the creation and validation of Expression Constraint Language queries

  • Creation and validation of Postcoordinated expressions using Compositional Grammar



How could this work?

Current experiment:

  • An extension of the CodeSystem definition

    • @Kai Kewley  drafted a JSON format to represent the required parts of the MRCM to support this use case.

    • Review and discuss

    • FHIR format feedback:

      • Can we split the long string, maybe by domain?

      • Alternative StructureMap rendering?

    • JSON format feedback:

      • Need to represent each attribute-domain

    • @michael lawley next iteration of the format.



Other options was considered but rejected because of demand of TS implementation complexity:

  • 1. Focus concept(s) -> MRCM Domain → set of domain - attributes

    • ConceptMap? - translate focus concept to set of attributes

      • A map would support returning additional information like grouping

  • 2. Attribute → Search within attribute range

  • New implicit URIs?

  • Consider supporting a reverse lookup - given a focus concept, which attributes can this be used within.

ECL History Supplements with no association

@Anne Randorff Højen 

@Kai Kewley 

Potential issue: Concepts made inactive with inactivation reason "Non conformance to editorial policy" currently have no historical association.

Use Cases

  • < 414408004 |Hispanic (racial group)| {{ +HISTORY }}

    • No historical associations found against the inactive children

Should ECL be able to retrieve these concepts

Options:

  • Include some association type in RF2 - could be generated before release.

  • Fix in ECL. Terminology server could link concepts without any association to their last active parents.

    • ECL engine could use the snapshot to find the last active parents

Discussed in Joint AG - 

  • Most favoured solution is to add more associations in the RF2 where possible, probably using a scripted process.

    • UK already doing this.

    • TODO: Could Jeremy provide more information on this?

ECL Maintenance Recommendations

All

We plan to add a "Maintenance Recommendations" page to the ECL guide.

Suggested sections:

  • What does best practice ECL look like - what are the benefits

  • ECL comments to record intent

  • Existing tooling and features

@Jeremy Rogers (Unlicensed) has drafted some content on this topic.

Group have reviewed the word document @Kai Kewley  to Migrate to ECL Guide Appendix for final review. 

ECL Results - TS consistency

@Jeremy Rogers (Unlicensed) 

Testing consistency between Snowray (Snow Owl), Ontoserver, Snowstorm. Also using custom made NHS Subset maintenance tool, would like to migrate to a standardised solution.

Questions:

  • Should inactive concepts be routinely suppressed from all results?

    • Answer: Inactive concepts should not be included when using hierarchy constraints, because they are not part of the hierarchy. They should be included when using wildcard. The default substrate includes inactive. Same in FHIR. All agree.

    • Action: Check the spec makes this clear. "Default substrate".

    • Known tooling issues: Snowstorm is not behaving well. e.g. ^ xxx AND YYY (where YYY is inactive). Check both native and FHIR API.


  • Should inactive concepts be returned as active members of a simple refset?

    • Yes - they are active members - all agree

    • Snowstorm issues - seek example


  • Are text definitions and FSNs routinely in scope of any description filters?

    • Text definitions should be left out?

      • Action: change the specification to exclude them by default - done

      • (FHIR should also exclude these when using "filter" parameter)

    • FSN 

      • KK: The FSN can be unique and help find relevant concepts, the PT should be presented

      • JR: The semantic tag can get in the way - 

      • We don't agree on this

      • Action: Let's add more examples around this.


  • Do description filters run by default over inactive descriptions?

    • Inactive are excluded by default in the spec, however there is no way to search active and inactive at once

      • Action: Update ECL Spec to allow searching over active and inactive (apply everywhere, concept, description, members) - done

        • Suggested syntax update ECL 2.3: 

        • .. TS should return error if no inactive descriptions loaded

    • Snow Owl searches active and inactive descriptions by default - needs to be realigned?


Copyright © 2026, SNOMED International