* * It might be just me thinking that some of the 21090 types are not that simple, so am interested in reactions of others. Here is the documentation of the term-code representation type CD, which explains how the 'no exceptions' (CNE) and 'exceptions' (CWE) variants should be realised:
A CD is a reference to a concept defined in an external code system, terminology, or ontology. A CD may contain a simple code - that is, a reference to a concept defined directly by the referenced code system, or it may contain an expression in some syntax defined by the referenced code system that can be meaningfully evaluated. e.g., the concept of a "left foot" as a post-coordinated term built from the primary code "FOOT" and the qualifier "LEFT". A CD may also contain an original text or phrase that served as the basis of the coding. This is preserved to allow for validation of the representation of the concept in various fashions. A CD can contain one or more translations into multiple coding systems. The translations are all representations of the same concept in various code systems. There is only one concept, and only the first CD may contain an original text. It is possible to represent the translation chain - which CD was translated from which - if desired. Each CD may also carry a rationale to indicate why it is represented. A CD with no nullFlavor attribute SHALL have a code attribute or nonNull originalText attribute. A CD that has a code, codeSystem or originalText attribute but does not meet external constraints of the applicable value set SHALL have a nullFlavor attribute with a value of OTH. Attributes with type CD are generally bound by externally specified constraints which constrain the coded concepts to which a CD may refer. These constraints may be qualified as "extensible" (CWE) or "not extensible" (CNE). If the constraint is not extensible (CNE), then a the CD that does not have a nullFlavor SHALL contain a code that conforms to the constraint. If the constraint is extensible (CWE) then a CD that does not have a nullFlavor SHALL contain either a code that exists in the domain with which the attribute is associated, a code from a locally defined code system, or just some originalText that describes the concept. If the code is taken from a locally defined code system, then the codeSystem property SHALL specify the local code system. For both CNE and CWE constraint types, the translations may contain nonNull codes from any source unless otherwise specified by the constraining model. For code systems that define expression syntaxes, CNE constraints may be used, providing that the code system definitions define the appropriate support to enable value sets to make useful statements about how to control the expression syntax, and that the value set machinery used also has the appropriate support. This is the data structure of a CD, with the HL7v3 message attributes in red: type CD = class ( / validTimeLow : characterstring,/ / validTimeHigh : characterstring,/ / controlInformationRoot : characterstring,/ / controlInformationExtension : characterstring,/ / nullFlavor : NullFlavor,/ / updateMode : UpdateMode,/ / flavorId : Set(characterstring),/ code : characterstring, codeSystem : characterstring, codeSystemName : characterstring, codeSystemVersion : characterstring, valueSet : characterstring, valueSetVersion : characterstring, displayName : ST, originalText : ED, codingRationale : CodingRationale, translation : Set(CD), source : CD ) Am I alone in thinking that this is not the simplest way to implement exceptions or not, to coding? The rules for setting NullFlavor are also not so simple. I would have thought a more obvious method would be to define a type with a text field in it, and then a subtype with coding, e.g. (with message attributes removed): type TEXT = class ( text : ST mappings: Set(CD) ) type CD: TEXT = class ( code : characterstring, codeSystem : characterstring, codeSystemName : characterstring, codeSystemVersion : characterstring, valueSet : characterstring, valueSetVersion : characterstring, codingRationale : CodingRationale, translation : Set(CD), source : CD ) This would enable specifiers to simply put TEXT for 'coded with exceptions' or CD for 'coded no exceptions' within a model, with the GUI making the relevant coding widgets available in the correct way (there are some slight benefits to making a more theoretically correct model, using 3 classes rather than just 2, but the differences are not significant). Note that I merged displayName and originalText, as this seems to be a modelling confusion; if originalText represents some other text, not the text of the code, then the whole data structure is essentially a mapping, not a coding of the text. One way to do this is shown with a 'mappings' attribute in the TEXT class (some people will object that this could be used infinitely, but in practice it is never a problem, since applications don't create such structures). In the original model, 'originalText' and 'displayName' would be the same much of the time. The rules to do with setting nullFlavor would make more sense elsewhere, not in the core model. There are also some interesting comments relating to the valueSet attribute: In many cases, a CD is created from a value set -- either a code/code system pair is chosen from a valueSet, or one is not chosen and the CD has the exceptional value of NullFlavor.OTH. If no code is chosen, it is generally inappropriate to reference the code system from which the code was chosen as the value set may not match the code system (may include a subset of the codeSystem, or additional terms from other code systems); instead, the value set should be provided. *In addition, there are some known use cases where the value set that a user or system was offered when choosing a code affects the interpretation of the code*. The last sentence above indicates that the meaning of a code stored in data might depend on how it was chosen. This would break the basic immutability of meaning of codes in a code system. I wonder how we would compute with such data? The 'translations' attribute is also strange: according to the documentation it is not about translations but about code synonyms and/or mappings (in reality two different things). - thomas beale -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.openehr.org/mailman/private/openehr-technical_lists.openehr.org/attachments/20101117/a0b668c3/attachment.html>