DavidStables (talk | contribs) |
DavidStables (talk | contribs) |
||
Line 29: | Line 29: | ||
The boolean operators 'and' , 'or' and 'not' can operate in either the from or where clause, using a "bool" predicate. 'and' is the same as an intersection (all must be true), or is a union (at least one true) and 'not' is a union of negation (any one must be false). Further nesting can resolve boolean combinations (e.g. not/and)<div class="toccolours mw-collapsible mw-collapsed"> | The boolean operators 'and' , 'or' and 'not' can operate in either the from or where clause, using a "bool" predicate. 'and' is the same as an intersection (all must be true), or is a union (at least one true) and 'not' is a union of negation (any one must be false). Further nesting can resolve boolean combinations (e.g. not/and)<div class="toccolours mw-collapsible mw-collapsed"> | ||
Example boolean operators. Select Expand to show: | Example boolean operators. Select Expand to show: | ||
{| class="wikitable" | |||
|+ | |||
!Plain | |||
!Json | |||
|- | |||
|query { | |||
from { | |||
where { | |||
with { | |||
then {} | |||
} | |||
} | |||
} | |||
select { | |||
where {} | |||
select {} | |||
} | |||
} | |||
|<syntaxhighlight lang="json"> | |||
{"query" : {"from" : { | |||
"where" :[ { | |||
"with" : { | |||
"then" : {} | |||
} | |||
]} | |||
}, | |||
"select" :[{ | |||
"where" : {}, | |||
"select" :[ {}] | |||
}], | |||
"subQuery" :[ {}] | |||
} | |||
</syntaxhighlight> | |||
|- | |||
|} | |||
'''Simple example''' | |||
Get me the full name of all patients aged >= 18 years. | |||
{| class="wikitable" | |||
|+ | |||
!Plain | |||
!Json | |||
|- | |||
|where{ | |||
{: age>- 18 units: years} | |||
and | |||
{:statedGender in :905031000252103|Male|} | |||
|<syntaxhighlight lang="json"> | |||
{"where" : { | |||
"bool" : "and", | |||
"where" : [ { "id" : "age", | |||
"operator" : ">=", | |||
"value" : 18, | |||
"unit" : "year"}, | |||
{"id" : "statedGender", | |||
"in" : [ {"@id" : "im:905031000252103", | |||
"name" : "Male (stated gender)" } ] } ] } | |||
</syntaxhighlight> | |||
} | |||
</syntaxhighlight> | |||
|- | |||
|} | |||
<div class="mw-collapsible-content"><syntaxhighlight lang="json"> | <div class="mw-collapsible-content"><syntaxhighlight lang="json"> | ||
{"where" : { | {"where" : { |
Revision as of 17:01, 11 March 2023
These pages describe the IM Query grammar conventions and meanding. The formal IMQ Grammar can be accessed in ABNF form at https://github.com/endeavourhealth-discovery/IMDirectory/blob/develop/im_library/src/antlr4/grammars/ECL.g4
Symbol conventions
A small set of symbols are used to represent meaningful language tokens. These are:
- '{' and '}' Used for clauses to differentiate the content from other similar clauses, as well as to indicate graph traversal. It is used in the same way as { } is used in Json to represent and object. For example 'where {age >75 units : years} encloses a where clause
- ',' comma used to indicate a list entry number 2 or more. the language does not require brackets to show a list. For example
where { :concept in sct:29857009,sct:25064002 } means that the in predicate is looking at a list of two concepts
- '@' used as an identifier qualifier to indicate a type. @im:Concept indicates that this refers to instances of type im:concept .For example:
from { @:Patient} means that the query is looking for all instances of type patient.
- '^' used as an identifier qualifier to indicate a set. For example:
from { ^ex:RegisteredPatients} means the set of registered patients, used mostly in referencing base populations or value /reference sets
- << subsumption qualifier used to indicate descendants or Self of against an identifier for example
where { :concept in <<sct:29857009} means the Snomed-CT concept identifier of 29857009 and any of its subtypes.
- '<' used to indicate 'descendants of but not including self' against an identifier. For example
where { :concept in <sct:29857009} would mean its subtypes but not itself
- '>>' used to indicate 'Ancestors of including self; against an identifier . For example
where { :concept in >>sct:29857009} would mean all concepts that are ancestors of chest pain
- '|' '|' used as a short cut to indicate the name of a concept or entity sct:29857009|Chest pain |
Identifiers
Query definitions include reference to a data model types, properties, concepts or sets. Identifiers are represented as RDF IRIs in both the full or prefixed form. For example:
http://snomed.info/sct# and sct: 29857009 may be equivalent where the query contains a prefix list
Boolean operators
The boolean operators 'and' , 'or' and 'not' can operate in either the from or where clause, using a "bool" predicate. 'and' is the same as an intersection (all must be true), or is a union (at least one true) and 'not' is a union of negation (any one must be false). Further nesting can resolve boolean combinations (e.g. not/and)
Example boolean operators. Select Expand to show:
Plain | Json |
---|---|
query {
from { where { with { then {} } } } select { where {} select {} } } |
{"query" : {"from" : {
"where" :[ {
"with" : {
"then" : {}
}
]}
},
"select" :[{
"where" : {},
"select" :[ {}]
}],
"subQuery" :[ {}]
}
|
Simple example
Get me the full name of all patients aged >= 18 years.
Plain | Json |
---|---|
where{
{: age>- 18 units: years} and {:statedGender in :905031000252103|Male|} |
{"where" : {
"bool" : "and",
"where" : [ { "id" : "age",
"operator" : ">=",
"value" : 18,
"unit" : "year"},
{"id" : "statedGender",
"in" : [ {"@id" : "im:905031000252103",
"name" : "Male (stated gender)" } ] } ] }
} </syntaxhighlight> |
{"where" : {
"bool" : "and",
"where" : [ { "id" : "age",
"operator" : ">=",
"value" : 18,
"unit" : "year"},
{"id" : "statedGender",
"in" : [ {"@id" : "im:905031000252103",
"name" : "Male (stated gender)" } ] } ] }