From 4965bf389517023db187ae4beb485ef3c2c037f6 Mon Sep 17 00:00:00 2001 From: Mark Czotter Date: Thu, 23 May 2024 13:18:34 +0200 Subject: [PATCH] docs: remove obsolete documentation files --- .gitbook.yaml | 5 - SUMMARY.md | 70 - docs/api/admin/index.md | 3 - docs/api/admin/upgrade.md | 3 - docs/api/cis/index.md | 7 - docs/api/fhir/codesystems.md | 45 - docs/api/fhir/conceptmaps.md | 16 - docs/api/fhir/index.md | 100 - docs/api/fhir/valuesets.md | 37 - docs/api/index.md | 196 -- docs/api/snomed/branching.md | 142 -- docs/api/snomed/classification.md | 3 - docs/api/snomed/classifications.md | 1 - docs/api/snomed/compare.md | 80 - docs/api/snomed/concepts.md | 1632 ----------------- docs/api/snomed/descriptions.md | 3 - docs/api/snomed/export.md | 3 - docs/api/snomed/images/parents_ancestors.png | Bin 61897 -> 0 bytes docs/api/snomed/import.md | 3 - docs/api/snomed/index.md | 26 - docs/api/snomed/members.md | 3 - docs/api/snomed/refsets.md | 51 - docs/api/snomed/relationships.md | 3 - docs/api/snomed/validation.md | 3 - docs/backup/curator.md | 166 -- docs/backup/index.md | 13 - docs/getting_started/basic-concepts.md | 42 - docs/getting_started/check-status.md | 42 - docs/getting_started/codesystems.md | 105 -- docs/getting_started/conclusion.md | 3 - docs/getting_started/explore.md | 12 - docs/getting_started/index.md | 11 - docs/getting_started/installation.md | 46 - docs/getting_started/snomed/create.md | 1 - docs/getting_started/snomed/export.md | 1 - docs/getting_started/snomed/import.md | 50 - docs/getting_started/snomed/index.md | 21 - docs/getting_started/snomed/search.md | 50 - docs/getting_started/snomed/version.md | 1 - docs/migration/from-6x.md | 53 - docs/migration/from-7x.md | 14 - docs/sct_extensions/development.md | 42 - docs/sct_extensions/extensions-and-snowowl.md | 55 - .../images/basic-edition-structure.png | Bin 18612 -> 0 bytes .../images/basic-extension-structure.png | Bin 19305 -> 0 bytes .../images/basic-international-structure.png | Bin 12891 -> 0 bytes .../images/extension-extends-another.png | Bin 26438 -> 0 bytes .../images/extension-from-scratch.png | Bin 17096 -> 0 bytes .../images/extension-upgrade-available.png | Bin 17635 -> 0 bytes .../images/extension-upgrade-complete.png | Bin 35509 -> 0 bytes .../extension-upgrade-regular-maintenance.png | Bin 31832 -> 0 bytes .../images/extension-upgrade-start.png | Bin 26668 -> 0 bytes .../sct_extensions/images/multi-extension.png | Bin 40480 -> 0 bytes .../images/prepare-for-release.png | Bin 26723 -> 0 bytes .../images/release-extension.png | Bin 28610 -> 0 bytes .../images/workflow-branch-authoring.png | Bin 25359 -> 0 bytes docs/sct_extensions/index.md | 79 - docs/sct_extensions/integrations.md | 0 docs/sct_extensions/release.md | 28 - docs/sct_extensions/scenarios/index.md | 8 - .../scenarios/multi-extension.md | 17 - .../scenarios/single-edition.md | 35 - .../scenarios/single-extension.md | 43 - docs/sct_extensions/upgrade.md | 65 - docs/setup/configure/disable-swap.md | 29 - docs/setup/configure/elasticsearch.md | 21 - docs/setup/configure/file-descriptors.md | 11 - docs/setup/configure/important-settings.md | 59 - docs/setup/configure/index.md | 46 - docs/setup/configure/jvm.md | 17 - docs/setup/configure/logging.md | 7 - docs/setup/configure/nthreads.md | 7 - docs/setup/configure/system-settings.md | 85 - docs/setup/configure/tweaking.md | 8 - docs/setup/configure/virtual-mem.md | 13 - docs/setup/index.md | 16 - docs/setup/install/debian.md | 102 -- docs/setup/install/docker.md | 142 -- docs/setup/install/index.md | 10 - docs/setup/install/rpm.md | 106 -- docs/setup/install/tarzip.md | 116 -- docs/setup/monitoring.md | 3 - docs/setup/reference.md | 1 - docs/setup/security/file.md | 26 - docs/setup/security/index.md | 79 - docs/setup/security/ldap.md | 97 - docs/setup/starting.md | 82 - docs/setup/stopping.md | 11 - 88 files changed, 4532 deletions(-) delete mode 100644 .gitbook.yaml delete mode 100644 SUMMARY.md delete mode 100644 docs/api/admin/index.md delete mode 100644 docs/api/admin/upgrade.md delete mode 100644 docs/api/cis/index.md delete mode 100644 docs/api/fhir/codesystems.md delete mode 100644 docs/api/fhir/conceptmaps.md delete mode 100644 docs/api/fhir/index.md delete mode 100644 docs/api/fhir/valuesets.md delete mode 100644 docs/api/index.md delete mode 100644 docs/api/snomed/branching.md delete mode 100644 docs/api/snomed/classification.md delete mode 100644 docs/api/snomed/classifications.md delete mode 100644 docs/api/snomed/compare.md delete mode 100644 docs/api/snomed/concepts.md delete mode 100644 docs/api/snomed/descriptions.md delete mode 100644 docs/api/snomed/export.md delete mode 100644 docs/api/snomed/images/parents_ancestors.png delete mode 100644 docs/api/snomed/import.md delete mode 100644 docs/api/snomed/index.md delete mode 100644 docs/api/snomed/members.md delete mode 100644 docs/api/snomed/refsets.md delete mode 100644 docs/api/snomed/relationships.md delete mode 100644 docs/api/snomed/validation.md delete mode 100644 docs/backup/curator.md delete mode 100644 docs/backup/index.md delete mode 100644 docs/getting_started/basic-concepts.md delete mode 100644 docs/getting_started/check-status.md delete mode 100644 docs/getting_started/codesystems.md delete mode 100644 docs/getting_started/conclusion.md delete mode 100644 docs/getting_started/explore.md delete mode 100644 docs/getting_started/index.md delete mode 100644 docs/getting_started/installation.md delete mode 100644 docs/getting_started/snomed/create.md delete mode 100644 docs/getting_started/snomed/export.md delete mode 100644 docs/getting_started/snomed/import.md delete mode 100644 docs/getting_started/snomed/index.md delete mode 100644 docs/getting_started/snomed/search.md delete mode 100644 docs/getting_started/snomed/version.md delete mode 100644 docs/migration/from-6x.md delete mode 100644 docs/migration/from-7x.md delete mode 100644 docs/sct_extensions/development.md delete mode 100644 docs/sct_extensions/extensions-and-snowowl.md delete mode 100644 docs/sct_extensions/images/basic-edition-structure.png delete mode 100644 docs/sct_extensions/images/basic-extension-structure.png delete mode 100644 docs/sct_extensions/images/basic-international-structure.png delete mode 100644 docs/sct_extensions/images/extension-extends-another.png delete mode 100644 docs/sct_extensions/images/extension-from-scratch.png delete mode 100644 docs/sct_extensions/images/extension-upgrade-available.png delete mode 100644 docs/sct_extensions/images/extension-upgrade-complete.png delete mode 100644 docs/sct_extensions/images/extension-upgrade-regular-maintenance.png delete mode 100644 docs/sct_extensions/images/extension-upgrade-start.png delete mode 100644 docs/sct_extensions/images/multi-extension.png delete mode 100644 docs/sct_extensions/images/prepare-for-release.png delete mode 100644 docs/sct_extensions/images/release-extension.png delete mode 100644 docs/sct_extensions/images/workflow-branch-authoring.png delete mode 100644 docs/sct_extensions/index.md delete mode 100644 docs/sct_extensions/integrations.md delete mode 100644 docs/sct_extensions/release.md delete mode 100644 docs/sct_extensions/scenarios/index.md delete mode 100644 docs/sct_extensions/scenarios/multi-extension.md delete mode 100644 docs/sct_extensions/scenarios/single-edition.md delete mode 100644 docs/sct_extensions/scenarios/single-extension.md delete mode 100644 docs/sct_extensions/upgrade.md delete mode 100644 docs/setup/configure/disable-swap.md delete mode 100644 docs/setup/configure/elasticsearch.md delete mode 100644 docs/setup/configure/file-descriptors.md delete mode 100644 docs/setup/configure/important-settings.md delete mode 100644 docs/setup/configure/index.md delete mode 100644 docs/setup/configure/jvm.md delete mode 100644 docs/setup/configure/logging.md delete mode 100644 docs/setup/configure/nthreads.md delete mode 100644 docs/setup/configure/system-settings.md delete mode 100644 docs/setup/configure/tweaking.md delete mode 100644 docs/setup/configure/virtual-mem.md delete mode 100644 docs/setup/index.md delete mode 100644 docs/setup/install/debian.md delete mode 100644 docs/setup/install/docker.md delete mode 100644 docs/setup/install/index.md delete mode 100644 docs/setup/install/rpm.md delete mode 100644 docs/setup/install/tarzip.md delete mode 100644 docs/setup/monitoring.md delete mode 100644 docs/setup/reference.md delete mode 100644 docs/setup/security/file.md delete mode 100644 docs/setup/security/index.md delete mode 100644 docs/setup/security/ldap.md delete mode 100644 docs/setup/starting.md delete mode 100644 docs/setup/stopping.md diff --git a/.gitbook.yaml b/.gitbook.yaml deleted file mode 100644 index 6dc5844539e..00000000000 --- a/.gitbook.yaml +++ /dev/null @@ -1,5 +0,0 @@ -redirects: - api/snomed: docs/api/snomed/index.md - api/core: docs/api/admin/index.md - api/fhir: docs/api/fhir/index.md - api/cis: docs/api/cis/index.md \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index 260b60ad7a9..00000000000 --- a/SUMMARY.md +++ /dev/null @@ -1,70 +0,0 @@ -# Table of contents - -* [Getting started](docs/getting_started/index.md) - * [Basic Concepts](docs/getting_started/basic-concepts.md) - * [Installation](docs/getting_started/installation.md) - * [Explore Snow Owl](docs/getting_started/explore.md) - * [Check Health](docs/getting_started/check-status.md) - * [List available Code Systems](docs/getting_started/codesystems.md) - * [SNOMED CT](docs/getting_started/snomed/index.md) - * [Import RF2 distribution](docs/getting_started/snomed/import.md) - * [Search SNOMED CT](docs/getting_started/snomed/search.md) - * [Create a Concept](docs/getting_started/snomed/create.md) - * [Version SNOMED CT](docs/getting_started/snomed/version.md) - * [Export SNOMED CT](docs/getting_started/snomed/export.md) - * [Conclusion](docs/getting_started/conclusion.md) -* [Set up Snow Owl](docs/setup/index.md) - * [Installing Snow Owl](docs/setup/install/index.md) - * [Installing Snow Owl with .zip or .tar.gz](docs/setup/install/tarzip.md) - * [Installing Snow Owl with RPM](docs/setup/install/rpm.md) - * [Installing Snow Owl with Debian Package](docs/setup/install/debian.md) - * [Installing Snow Owl with Docker](docs/setup/install/docker.md) - * [Configuring Snow Owl](docs/setup/configure/index.md) - * [Setting JVM options](docs/setup/configure/jvm.md) - * [Logging configuration](docs/setup/configure/logging.md) - * [Elasticsearch configuration](docs/setup/configure/elasticsearch.md) - * [Important Snow Owl configuration](docs/setup/configure/important-settings.md) - * [Important System configuration](docs/setup/configure/system-settings.md) - * [Disable swapping](docs/setup/configure/disable-swap.md) - * [File descriptors](docs/setup/configure/file-descriptors.md) - * [Virtual memory](docs/setup/configure/virtual-mem.md) - * [Number of threads](docs/setup/configure/nthreads.md) - * [Tweaking for performance](docs/setup/configure/tweaking.md) - * [Starting Snow Owl](docs/setup/starting.md) - * [Stopping Snow Owl](docs/setup/stopping.md) - * [Configuring security](docs/setup/security/index.md) - * [Configuring a file realm](docs/setup/security/file.md) - * [Configuring an LDAP realm](docs/setup/security/ldap.md) - * [Configuring monitoring](docs/setup/monitoring.md) - * [Configuration reference](docs/setup/reference.md) -* [Extension Management](docs/sct_extensions/index.md) - * [Extensions and Snow Owl](docs/sct_extensions/extensions-and-snowowl.md) - * [Scenarios](docs/sct_extensions/scenarios/index.md) - * [Single Edition](docs/sct_extensions/scenarios/single-edition.md) - * [Single Extension Authoring](docs/sct_extensions/scenarios/single-extension.md) - * [Multi Extension Authoring](docs/sct_extensions/scenarios/multi-extension.md) - * [Development](docs/sct_extensions/development.md) - * [Releases](docs/sct_extensions/release.md) - * [Upgrading](docs/sct_extensions/upgrade.md) - * [Integrations](docs/sct_extensions/integrations.md) -* [API](docs/api/index.md) - * [Core API](docs/api/admin/index.md) - * [SNOMED CT API](docs/api/snomed/index.md) - * [Branching](docs/api/snomed/branching.md) - * [Compare](docs/api/snomed/compare.md) - * [Commits](docs/api/snomed/commits.md) - * [Concepts](docs/api/snomed/concepts.md) - * [Descriptions](docs/api/snomed/descriptions.md) - * [Relationships](docs/api/snomed/relationships.md) - * [Reference Sets](docs/api/snomed/refsets.md) - * [Classification](docs/api/snomed/classifications.md) - * [Importing RF2](docs/api/snomed/imports.md) - * [Exporting RF2](docs/api/snomed/emports.md) - * [CIS API](docs/api/cis/index.md) - * [FHIR API](docs/api/fhir/index.md) - * [CodeSystem](docs/api/fhir/codesystems.md) - * [ValueSet](docs/api/fhir/valuesets.md) - * [ConceptMap](docs/api/fhir/conceptmaps.md) -* [Backup and Restore](docs/backup/index.md) - * [Curator](docs/backup/curator.md) -* [Migrate from 7.x](docs/migration/from-7x.md) diff --git a/docs/api/admin/index.md b/docs/api/admin/index.md deleted file mode 100644 index 8389e630558..00000000000 --- a/docs/api/admin/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Administration API - -Detailed API documentation is coming soon! Until then we recommend to check out the official Swagger documentation available on your Snow Owl instance at [/snowowl/admin](http://localhost:8080/snowowl/admin). \ No newline at end of file diff --git a/docs/api/admin/upgrade.md b/docs/api/admin/upgrade.md deleted file mode 100644 index 0525cbd896f..00000000000 --- a/docs/api/admin/upgrade.md +++ /dev/null @@ -1,3 +0,0 @@ -# Code System Upgrade API - -Coming soon! \ No newline at end of file diff --git a/docs/api/cis/index.md b/docs/api/cis/index.md deleted file mode 100644 index df6357bbf0d..00000000000 --- a/docs/api/cis/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Component Identifier Service (CIS) API - -This describes the resources that make up the official Snow Owl® CIS API. - -{% hint style="info" %} -Swagger documentation available on your Snow Owl instance at [/snowowl/cis](http://localhost:8080/snowowl/cis). -{% endhint %} \ No newline at end of file diff --git a/docs/api/fhir/codesystems.md b/docs/api/fhir/codesystems.md deleted file mode 100644 index 73a4dd3f511..00000000000 --- a/docs/api/fhir/codesystems.md +++ /dev/null @@ -1,45 +0,0 @@ -## CodeSystem API - -Code Systems maintained within Snow Owl are exposed (read-only) via the endpoints `/CodeSystem` and `/CodeSystem/{codeSystemId}`.  Supported concept properties are handled and returned if requested. The currently exposed code systems are: - -Snow Owl OSS: -* SNOMED CT - -Snow Owl: -* ATC -* ICD-10 (and extensions) -* LOINC -* OPCS -* Local Code Systems -* Any other terminology -### SNOMED CT - -All standard and default SNOMED CT properties are supported, including the relationship type and concrete value properties. In addition to the FHIR SNOMED CT properties, Snow Owl can return the _effective time property_, with the URI `http://snomed.info/field/Concept.effectiveTime`. - -### Operations -#### $lookup - -Both _GET_ as well as _POST_ HTTP methods are supported. Concepts are queried based on `code`,  `version`, `system` or `Coding`. Designations are included as part of the response as well as supported concept properties when requested. No `date` parameter is supported. - -Example for looking up properties (_inactive and method_) of the latest version of a SNOMED CT _procedure by method_ code: -``` - /CodeSystem/$lookup?system=http://snomed.info/sct&code=128927009&_format=json&property=inactive&property=http://snomed.info/id/260686004 -``` - -For SNOMED CT, all common and SNOMED CT properties are supported, including all active relationship types. -#### $validate-code - -Both _GET_ as well as _POST_ HTTP methods are supported for all exposed terminologies. -Example for validating a SNOMED CT code: -``` -/CodeSystem/SNOMEDCT/2021-07-31/$validate-code?code=128927009 -``` - -#### $subsumes - -Both _GET_ as well as _POST_ HTTP methods are supported. Subsumption testing is supported for all terminologies, including SNOMED CT. - -Example for SNOMED CT (version 2021-07-31): -``` -/CodeSystem/$subsumes?codeA=409822003&codeB=264395009&system=http://snomed.info/sct/900000000000207008/version/20210731 -``` diff --git a/docs/api/fhir/conceptmaps.md b/docs/api/fhir/conceptmaps.md deleted file mode 100644 index 429a3f008a8..00000000000 --- a/docs/api/fhir/conceptmaps.md +++ /dev/null @@ -1,16 +0,0 @@ -## ConceptMap API - -The endpoints `/ConceptMap` and `/ConceptMap/{conceptMapId}` and corresponding operations expose the following types of terminology resources: - -* SNOMED CT Simple Map Reference Sets with Concepts as referenced components -* SNOMED CT Complex Map Reference Sets -* SNOMED CT Extended Map Reference Sets -* Snow Owl's generic Concept Maps - -## $translate - -All concept map accessible via the `/ConceptMap` endpoints are considered when retrieving mappings (_translations_). The translate request's _source_ that designates the source value set cannot be interpreted hence not used. With the exception of SNOMED CT where the standard URI is expected, our proprietary _short name_ or _component ids_ are used to designate the source/target code system. - -SNOMED CT: -* Simple Map Type Reference Set mappings are considered _equivalent_ in terms of their correlation -* The availability and format of target code systems are not guaranteed, there is an ongoing conversation at SNOMED CT International to rectify this. \ No newline at end of file diff --git a/docs/api/fhir/index.md b/docs/api/fhir/index.md deleted file mode 100644 index 76de0fd50ea..00000000000 --- a/docs/api/fhir/index.md +++ /dev/null @@ -1,100 +0,0 @@ -# FHIR API - -Fast Healthcare Interoperability Resources (FHIR) specifies resources, operations, coded data types and terminologies that are used for representing and communicating coded, structured data in the FHIR core specification within its Terminology Module. - -Snow Owl's pluggable and extensible architecture allows modular development of the FHIR API both in terms of the supported functionality as well as the exposed terminologies.  Additionally, Snow Owl's revision-based model allows the concurrent management of multiple versions. - -# Resources - -The Snow Owl terminology server's FHIR API release includes support for the following resources: - -* [CodeSystem API](./codesystems.md) -* [ValueSet API](./valuesets.md) -* [ConceptMap API](./conceptmaps.md) -* [Bundle API](./bundles.md) -* [CapabilityStatement API](./metadata.md) - -## Versions - -Versions in Snow Owl are represented as individual FHIR Resources when accessed via the FHIR API endpoints. If there are no versions present for a given resource, only the latest development version is returned as available FHIR Resource. When accessing a terminology resource via the FHIR API, but without specifying an exact version tag, then the system will always assume and return the latest development version, including not yet published changes. It is recommended to always query a specific version of any terminology content to get consistent results, especially when the same terminology server instance is being used for both authoring and distribution. - -## Search - -Resource representations can be filtered by the following supported official FHIR payload filters: - -* _summary - to return a predefined set of properties and their values -* _elements - to return only the mandatory and the specified list of properties and nothing else - -The supported search parameters: -* _id - to filter FHIR resources by their logical identifier -* name - to filter FHIR resources by their name (which in Snow Owl equals to the logical identifier) -* title - to filter FHIR resources by their title property lexically (Snow Owl by default uses exact, phrase and prefix matching during its lexical search activities) -* url - to filter FHIR resources by their assigned `url` value -* system - to filter FHIR resources by their assigned `system` value (which in Snow Owl always matches the `url` value) -* version - to filter FHIR resource by their `version` property value -* _lastUpdated - exposed but not supported yet - -## Sorting and paging -Sorting supported via standard FHIR sort parameters, while paging is supported with a new `after` parameter (using `count` as page size). `Offset` + `count` based traditional paging is not supported. - -## URIs -Globally unique logical URIs that represent a terminology resource. For code systems these are: - -| Code system | URI | -|---------------------------|---------------------------------------| -| SNOMED CT | http://snomed.info/sct | -| LCS | Defined when the resource was created | -| Value Set | Defined when the resource was created | -| Concept Map | Defined when the resource was created | -| ATC | http://www.whocc.no/atc | -| ICD-10 | http://hl7.org/fhir/sid/icd-10 | -| LOINC | http://loinc.org | -| | | - -### SNOMED CT - -For SNOMED CT, Snow Owl's FHIR implementation follows the [SNOMED CT URI Standard](https://confluence.ihtsdotools.org/display/DOCURI). - -### ICD-10 - -For ICD-10, Snow Owl's FHIR implementation follows the [HL7 FHIR Specification](https://www.hl7.org/fhir/icd.html). - -### Local Code System - -Snow Owl's Local Code Systems (LCS) identified by the URI that is based on the _Organization Link_ property stored within Snow Owl's Terminology Registry and the _Short Name_ of the LCS e.g.: https://b2ihealthcare.com/MyLocalCodeSystem. - - -## IDs - -The logical _id_ field of each resource is assigned by Snow Owl and is unique within it. Once it has been assigned, the _id_ never changes. For this logical identifier, Snow Owl follows the pattern: - - resourceId[/version] - -For example to identify a particular SNOMED CT Edition with its version _2021-03-01_: - - SNOMEDCT-US/2021-03-01 - -For example to identify a particular LOINC code system with the version tag _v2.64_: - - LOINC/v2.64 - -## REST API - -Currently only JSON format is supported with UTF-8 encoding and content type of `Content-Type = application/fhir+json;charset=utf-8`. In case of any errors during the processing the API responds with an `OperationOutCome` within the response body using one of the HTTP status codes: - -| HTTP Status | Reason | -| ------------- | -------------- | -| 200 | OK | -| 400 | Bad Request | -| 401 | Unauthorized | -| 403 | Forbidden | -| 404 | Not Found | -| 500 | Internal Error | - -# Snow Owl's extension API - -Snow Owl exposes a comprehensive REST API to support areas such as: - * Syndication - content provisioning between servers or between the Snow Owl Authoring platform and servers - * Administration (repository and revision control management) - * Auditing - * SNOMED CT specific browsing and authoring API \ No newline at end of file diff --git a/docs/api/fhir/valuesets.md b/docs/api/fhir/valuesets.md deleted file mode 100644 index 0cb237d5490..00000000000 --- a/docs/api/fhir/valuesets.md +++ /dev/null @@ -1,37 +0,0 @@ -## ValueSet API - -The endpoints `/ValueSet` and `/ValueSet/{valueSetId}` and corresponding operations expose all Value Set resources stored (or implict Value Sets if the corresponding Value Set plug-in supports it) in the server. CUD operations are not supported. - -## $expand - -All value sets accessible via the `/ValueSet` endpoints can be _expanded_. - -For SNOMED CT URIs, implicit value sets are supported: - - * ?fhir_vs - all Concept IDs in the edition/version. If the base URI is http://snomed.info/sct, this means all possible SNOMED CT concepts - * ?fhir_vs=isa/[sctid] - all concept IDs that are subsumed by the specified Concept. - * ?fhir_vs=refset - all concept ids that correspond to real references sets defined in the specified SNOMED CT edition - * ?fhir_vs=refset/[sctid] - all concept IDs in the specified reference set - -The following in-parameters are supported: -* activeOnly - to return only active codes in the response -* filter - to filter the results lexically -* displayLanguage - to select the language for the returned display values -* includeDesignations - whether to include all designations or not in the returned response -* count - to select the number of codes to be returned in the expansion -* after - to select codes to be returned after this last page value (cursor) - -## $validate-code - -Codes can be validated against a given Value Set specified by the value set's logical id or canonical URL. In terms of Snow Owl terminology components, codes are validated against: - -* SNOMED CT Simple Type Reference Sets with Concepts as referenced components. -* SNOMED CT Query Type Reference Sets with ECL expressions (each member is a Value Set) -* Snow Owl's generic Value Sets - -Validation performs the following checks: - * The existence of the given Value Set (__error__ if not found) - * The existence of the reference in the existing Value Set to the given code (__error__ if not found) - * The existence of the given code in the system (__error__ if not found) - * Potential version mismatch (__error_ if the reference points to a version that is different to the code's version) - * The status of the given code and reference (__warning__ if code is inactive while reference is active) \ No newline at end of file diff --git a/docs/api/index.md b/docs/api/index.md deleted file mode 100644 index 39dffa0720e..00000000000 --- a/docs/api/index.md +++ /dev/null @@ -1,196 +0,0 @@ -# Snow Owl API - -This describes the resources that make up the official Snow Owl® RESTful API. - -## Media Types - -Custom media types are used in the API to let consumers choose the format of the data they wish to receive. This is done by adding one of the following types to the Accept header when you make a request. Media types are specific to resources, allowing them to change independently and support formats that other resources don’t. - -The most basic media types the API supports are: - -* application/json (default) -* text/plain;charset=UTF-8 -* text/csv;charset=UTF-8 -* application/octet-stream (for file downloads) -* multipart/form-data (for file uploads) - -The generic JSON media type (application/json) is available as well, but we encourage you to explicitly set the accepted content type before sending your request. - -## Schema - -All data is sent and received as JSON. Blank fields are omitted instead of being included as `null`. - -All non-effective time timestamps are returned in ISO 8601 format: - - YYYY-MM-DDTHH:MM:SSZ - -Effective Time values are sent and received in short format: - - yyyyMMdd - -## Hypermedia - -All POST requests return `Location` headers pointing to the created resource instead of including either the identifier or the entire created resource in the response body. These are meant to provide explicit URLs so that proper API clients don’t need to construct URLs on their own. It is highly recommended that API clients use these. Doing so will make future upgrades of the API easier for developers. All URLs are expected to be proper `RFC 6570 URI` templates. - -Example Location Header: - - http://example.com/snowowl/snomedct/MAIN/concepts/123456789 - -## Pagination - -Requests that return multiple items will be paginated to `50` items by default. You can request further pages with the `searchAfter` query parameter. - -## Link/Resource expansion - -Where applicable, the `expand` query parameter will include nested objects in the response, to avoid having to issue multiple requests to the server. - -Expanded properties should be followed by parentheses and separated by commas; any options for the expanded property should be given within the parentheses, including properties to expand. Typical values for parameters are given in the "Implementation Notes" section of each endpoint. - - GET /snowowl/snomedct/MAIN/concepts?offset=0&limit=50&expand=fsn(),descriptions() - -Response: - - { - "items": [ - { - "id": "100005", - "released": true, - ... - "fsn": { - "id": "2709997016", - "term": "SNOMED RT Concept (special concept)", - ... - }, - "descriptions": { - "items": [ - { - "id": "208187016", - "released": true, - ... - }, - ], - "offset": 0, - "limit": 5, - "total": 5 - } - }, - ... - ], - "offset": 0, - "limit": 50, - "total": 421657 - } - -## Client Errors - -There are three possible types of client errors on API calls that receive request bodies: - -### Invalid JSON - - Status: 400 Bad Request - { - "status" : "400", - "message" : "Invalid JSON representation", - "developerMessage" : "detailed information about the error for developers" - } - -### Valid JSON but invalid representation - - Status: 400 Bad Request - { - "status" : "400", - "message" : "2 Validation errors", - "developerMessage" : "Input representation syntax or validation errors. Check input values.", - "violations" : ["violation_message_1", "violation_message_2"] - } - -### Conflicts - - Status: 409 Conflict - { - "status" : "409", - "message" : "Cannot merge source 'branch1' into target 'MAIN'." - } - -## Server Errors - -In certain circumstances, Snow Owl might fail to process and respond to a request and responds with a `500 Internal Server Error`. - - Status: 500 Internal Server Error - { - "status" : "500", - "message" : "Something went wrong during the processing of your request.", - "developerMessage" : "detailed information about the error for developers" - } - -To troubleshoot these please examine the log files at `{SERVER_HOME}/serviceability/logs/log.log` and/or [raise an issue on GitHub](https://github.com/b2ihealthcare/snow-owl/issues/new). - -## Path expressions - -Snow Owl is a revision-based terminology server, where each stored terminology data (concepts, descriptions, etc.) is stored in multiple revisions, across multiple branches. When requesting content from the terminology server, clients are able to specify a path value or expression to select the content they'd like to access and receive. For example, Snow Owl supports importing SNOMED CT content from different sources, allowing eg. multiple national **Extensions** to co-exist with the base **International Edition** provided by SNOMED International. Versioned editions can be consulted when non-current representations of concepts need to be accessed. Concept authoring and review can also be done in isolation. Both Java and REST API endpoints require a `path` parameter to select the content (or **substrate**) the user wishes to work with. - -The following formats are accepted: - -### Absolute branch path - -Absolute branch path parameters start with `MAIN` and point to a branch in the backing terminology repository. In the following example, all concepts are considered to be part of the substrate that are on branch `MAIN/2021-01-31/SNOMEDCT-UK-CL` or any ancestor (ie. `MAIN` or `MAIN/2021-01-31`), unless they have been modified: - -```json -GET /snomedct/MAIN/2021-01-31/SNOMEDCT-UK-CL/concepts -{ - "items": [ - { - "id": "100000000", - "released": true, - "active": false, - "effectiveTime": "20090731", -[...] -``` - -### Relative branch path - -Relative branch paths start with a short name identifying a SNOMED CT code system, and are relative to the code system's working branch. For example, if the working branch of code system `SNOMEDCT-UK-CL` is configured to `MAIN/2021-01-31/SNOMEDCT-UK-CL`, concepts visible on authoring task #100 can be retrieved using the following request: - -```json -GET /snomedct/SNOMEDCT-UK-CL/100/concepts -``` - -An alternative request that uses an absolute path would be the following: - -```json -GET /snomedct/MAIN/2021-01-31/SNOMEDCT-UK-CL/100/concepts -``` - -An important difference is that the relative `path` parameter tracks the working branch specified in the code system's settings, so requests using relative paths do not need to be adjusted when a code system is upgraded to a more recent International Edition. - -### Path range - -The substrate represented by a path range consists of concepts that were created or modified between a starting and ending point, each identified by an absolute branch path (relative paths are not supported). The format of a path range is `fromPath...toPath`. - -To retrieve concepts authored or edited following version 2020-08-05 of code system SNOMEDCT-UK-CL, the following path expression should be used: - -```json -GET /snomedct/MAIN/2019-07-31/SNOMEDCT-UK-CL/2020-08-05...MAIN/2021-01-31/SNOMEDCT-UK-CL/concepts -``` - -The result set includes the ones appearing or changing between versions 2019-07-31 and 2021-01-31 of the International Edition; if this is not desired, additional constraints can be added to exclude them. - -### Path with timestamp - -To refer to a branch state at a specific point in time, use the `path@timestamp` format. The timestamp is an integer value expressing the number of milliseconds since the UNIX epoch, 1970-01-01 00:00:00 UTC, and corresponds to "wall clock" time, not component effective time. As an example, if the SNOMED CT International version 2021-07-31 is imported on 2021-09-01 13:50:00 UTC, the following request to retrieve concepts will not include any new or changed concepts appearing in this release: - -```json -GET /snomedct/MAIN@1630504199999/concepts -``` - -Both absolute and relative paths are supported in the `path` part of the expression. - -### Branch base point - -Concept requests using a branch base point reflect the state of the branch at its beginning, before any changes on it were made. The format of a base path is `path^` (only absolute paths are supported): - -```json -GET /snomedct/MAIN/2019-07-31/SNOMEDCT-UK-CL/101^/concepts -``` - -Returned concepts include all additions and modifications made on SNOMEDCT-UK-CL's working branch, up to point where task #101 starts; neither changes committed to the working branch after task #101, nor changes on task #101 itself are reflected in the result set. \ No newline at end of file diff --git a/docs/api/snomed/branching.md b/docs/api/snomed/branching.md deleted file mode 100644 index f8c2f1d0c5f..00000000000 --- a/docs/api/snomed/branching.md +++ /dev/null @@ -1,142 +0,0 @@ -# Branching API - -Snow Owl provides branching support for terminology repositories. In each repository there is an always existing and `UP_TO_DATE` branch called **MAIN**. The `MAIN` branch represents the latest working version of your terminology (similar to a `master` branch on GitHub). - -You can create your own branches and create/edit/delete components and other resources on them. Branches are identified with their full path, which should always start with `MAIN`. For example the branch `MAIN/a/b/c/d` represents a branch under the parent `MAIN/a/b/c` with name `d`. - -Later you can decide to either delete the branch or merge the branch back to its parent. To properly merge a branch back into its parent, sometimes it is required to rebase (synchronize) it first with its parent to get the latest changes. This can be decided via the state attribute of the branch, which represents the current state compared to its parent state. - -## Branch states - -There are five different branch states available: - -1. UP_TO_DATE - the branch is up-to-date with its parent there are no changes neither on the branch or on its parent -2. FORWARD - the branch has at least one commit while the parent is still unchanged. Merging a branch requires this state, otherwise it will return a HTTP 409 Conflict. -3. BEHIND - the parent of the branch has at least one commit while the branch is still unchanged. The branch can be safely rebased with its parent. -4. DIVERGED - both parent and branch have at least one commit. The branch must be rebased first before it can be safely merged back to its parent. -5. STALE - the branch is no longer in relation with its former parent, and should be deleted. - -{% hint style="info" %} -Snow Owl supports merging of unrelated (STALE) branches. So branch `MAIN/a` can be merged into `MAIN/b`, there does not have to be a direct parent-child relationship between the two branches. -{% endhint %} - -## Basics - -### Get a branch - - GET /branches/:path - -Response - - Status: 200 OK - { - "name": "MAIN", - "baseTimestamp": 1431957421204, - "headTimestamp": 1431957421204, - "deleted": false, - "path": "MAIN", - "state": "UP_TO_DATE" - } - -### Get all branches - - GET /branches - -Response - - Status: 200 OK - { - "items": [ - { - "name": "MAIN", - "baseTimestamp": 1431957421204, - "headTimestamp": 1431957421204, - "deleted": false, - "path": "MAIN", - "state": "UP_TO_DATE" - } - ] - } - -### Create a branch - - POST /branches - -Input - - { - "parent" : "MAIN", - "name" : "branchName", - "metadata": {} - } - -Response - - Status: 201 Created - Location: http://localhost:8080/snowowl/snomedct/branches/MAIN/branchName - -### Delete a branch - - DELETE /branches/:path - -Response - - Status: 204 No content - -## Merging - -### Perform a merge - - POST /merges - -Input - - { - "source" : "MAIN/branchName", - "target" : "MAIN" - } - -Response - - Status: 202 Accepted - Location: http://localhost:8080/snowowl/snomedct/merges/2f4d3b5b-3020-4e8e-b046-b8266967d7dc - -### Perform a rebase - - POST /merges - -Input - - { - "source" : "MAIN", - "target" : "MAIN/branchName" - } - -Response - - Status: 202 Accepted - Location: http://localhost:8080/snowowl/snomedct/merges/c82c443d-f3f4-4409-9cdb-a744da336936 - -### Monitor progress of a merge or rebase - - GET /merges/c82c443d-f3f4-4409-9cdb-a744da336936 - -Response - - { - "id": "c82c443d-f3f4-4409-9cdb-a744da336936", - "source": "MAIN", - "target": "MAIN/branchName", - "status": "COMPLETED", - "scheduledDate": "2016-02-29T13:52:45Z", - "startDate": "2016-02-29T13:52:45Z", - "endDate": "2016-02-29T13:53:06Z" - } - -### Remove merge or rebase queue item - - DELETE /merges/c82c443d-f3f4-4409-9cdb-a744da336936 - -Response - - Status: 204 No content diff --git a/docs/api/snomed/classification.md b/docs/api/snomed/classification.md deleted file mode 100644 index 695f3c98036..00000000000 --- a/docs/api/snomed/classification.md +++ /dev/null @@ -1,3 +0,0 @@ -# SNOMED CT Classification API - -Coming soon! \ No newline at end of file diff --git a/docs/api/snomed/classifications.md b/docs/api/snomed/classifications.md deleted file mode 100644 index 992acff0b83..00000000000 --- a/docs/api/snomed/classifications.md +++ /dev/null @@ -1 +0,0 @@ -# Classification API \ No newline at end of file diff --git a/docs/api/snomed/compare.md b/docs/api/snomed/compare.md deleted file mode 100644 index b6c30330d86..00000000000 --- a/docs/api/snomed/compare.md +++ /dev/null @@ -1,80 +0,0 @@ -## Compare API - -Comparison for current terminology changes committed to a source or target branch can be conducted by creating a compare resource. - -A review identifier can be added to merge requests as an optional property. If the source or target branch state is different from the values captured when creating the review, the merge/rebase attempt will be rejected. This can happen, for example, when additional commits are added to the source or the target branch while a review is in progress; the review resource state becomes STALE in such cases. - -Reviews and concept change sets have a limited lifetime. CURRENT reviews are kept for 15 minutes, while review objects in any other states are valid for 5 minutes by default. The values can be changed in the server's configuration file. - -## Compare two branches - - POST /compare - { - "baseBranch": "MAIN", - "compareBranch": "MAIN/a", - "limit": 100 - } - -Response - - Status: 200 OK - { - "baseBranch": "MAIN", - "compareBranch": "MAIN/a", - "compareHeadTimestamp": 1567282434400, - "newComponents": [], - "changedComponents": ["138875005"], - "deletedComponents": [], - "totalNew": 0, - "totalChanged": 1, - "totalDeleted": 0 - } - -## Read component state from comparison - -Terminology components (and in fact any content) can be read from any point in time by using the special path expression: `{branch}@{timestamp}`. -To get the state of a SNOMED CT Concept from the previous comparison on the `compareBranch` at the returned `compareHeadTimestamp`, you can use the following request: - -Request - - GET /snomedct/MAIN@1567282434400/concepts/138875005 - -Response - - Status: 200 OK - { - "id": "138875005", - ... - } - -To get the state of the same SNOMED CT Concept but on the base branch, you can use the following request: - -Request - - GET /snomedct/MAIN/concepts/138875005 - -Response - - Status: 200 OK - { - "id": "138875005", - ... - } - -Additionally, if required to compute what's changed on the component since the creation of the task, it is possible to get back the base version of the changed component by using another special path expression: `{branch}^`. - -Request - - GET /snomedct/MAIN/a^/concepts/138875005 - -Response - - Status: 200 OK - { - "id": "138875005", - ... - } - -{% hint style="warn" %} -These characters are not URL safe characters, thus they must be encoded before sending the HTTP request. -{% endhint %} \ No newline at end of file diff --git a/docs/api/snomed/concepts.md b/docs/api/snomed/concepts.md deleted file mode 100644 index b8de46cdc28..00000000000 --- a/docs/api/snomed/concepts.md +++ /dev/null @@ -1,1632 +0,0 @@ -# SNOMED CT Concept API - -## Introduction - -**SNOMED CT concepts** represent ideas that are relevant in a clinical setting and have a unique concept identifier (a SNOMED CT identifier or **SCTID** for short) assigned to them. The terminology covers a wide set of domains and includes concepts that represent parts of the human body, clinical findings, medicinal products and devices, among many others. SCTIDs make it easy to refer unambiguously to the described ideas in eg. an Electronic Health Record or prescription, while SNOMED CT's highly connected nature allows complex analytics to be performed on aggregated data. - -Each concept is associated with human-readable **description**s that help users select the SCTID appropriate for their use case, as well as **relationship**s that form links between other concepts in the terminology, further clarifying their intended meaning. The API for manipulating the latter two types of components are covered in sections [Descriptions](descriptions.md) and [Relationships](relationships.md), respectively. - -The three component types mentioned above (also called **core components**) have a distinct set of attributes which together form the concept's definition. As an example, each concept includes an attribute (the **definition status**) which states whether the definition is sufficiently defined (and so can be computationally processed), or relies on a (human) reader to come up with the correct meaning based on the associated descriptions. - -Terminology services exposed by Snow Owl allows clients to *create*, *retrieve*, *modify* or *remove* concepts from a SNOMED CT code system (concepts that are considered to be already published to consumers can only be removed with an administrative operation). Concepts can be retrieved by SCTID or description search terms; results can be further constrained via Expression Constraint Language (**ECL** for short) expressions. - -## Resource format - -A concept resource without any expanded properties looks like the following: - -```json -{ - "id": "138875005", - "released": true, - "active": true, - "effectiveTime": "20020131", - "moduleId": "900000000000207008", - "iconId": "snomed_rt_ctv3", - "definitionStatus": { - "id": "900000000000074008" - }, - "subclassDefinitionStatus": "NON_DISJOINT_SUBCLASSES", - "ancestorIds": [], - "parentIds": [ - "-1" - ], - "statedAncestorIds": [], - "statedParentIds": [ - "-1" - ], - "definitionStatusId": "900000000000074008" -} -``` - -### Properties - -The resource includes all RF2 properties that are defined in SNOMED International's [Release File Specification](https://confluence.ihtsdotools.org/display/DOCRELFMT/4.2.1+Concept+File+Specification)🌎: - -- `id` -- `effectiveTime` -- `active` -- `moduleId` -- `definitionStatusId` - -It also contains the following supplementary information: - -- `parentIds`, `ancestorIds` - -These arrays hold a set of SCTIDs representing the concept's direct and indirect ancestors in the inferred taxonomy. The (direct) parents array contains all `destinationId`s from active and inferred IS A relationships where the `sourceId` matches this concept's SCTID, while the ancestor array contains all SCTIDs taken from the parent and ancestor array of direct parents. The arrays are sorted by SCTID. A value of `-1` means that the concept is a **root concept** that does not have any concepts defined as its parent. Typically, this only applies to `138875005|Snomed CT Concept|` in SNOMED CT content. - -See the following example response for a concept placed deeper in the tree: - -```json -GET /snomedct/MAIN/concepts/425758004 // Diagnostic blood test -{ - [...] - "ancestorIds": [ - "-1", // Special value for taxonomy root - "15220000", // Laboratory test - "71388002", // Procedure - "108252007", // Laboratory procedure (not pictured below) - "128927009", // Procedure by method - "138875005", // SNOMED CT Concept - "362961001", // Procedure by intent - "386053000" // Evaluation procedure - ], - "parentIds": [ - "103693007", // Diagnostic procedure - "396550006" // Blood test - ], - [...] -} -``` - -Compare the output with a rendering from a user interface, where the concept appears in two different places after exploring alternative routes in the hierarchy. Parents are marked with blue, while ancestors are highlighted with orange: - -![Parents and ancestors](images/parents_ancestors.png) - -- `statedParentIds`, `statedAncestorIds` - -Same as the above, but for the stated taxonomy view. - -- `released` - -A boolean value indicating whether this concept was part of at least one SNOMED CT release. New concepts start with a value of `false`, which is set to `true` as part of the code system versioning process. Released concepts can only be deleted by an administrator. - -- `iconId` - -A descriptive key for the concept's icon. The icon identifier typically corresponds to the lowercase, underscore-separated form of the [hierarchy tag](https://confluence.ihtsdotools.org/display/DOCGLOSS/hierarchy+tag)🌎 contained in each concept's Fully Specified Name (or **FSN** for short). The following keys are currently expected to appear in responses (subject to change): - -`administration_method`, -`assessment_scale`, -`attribute`, -`basic_dose_form`, -`body_structure`, -`cell`, -`cell_structure`, -`clinical_drug`, -`disorder`, -`disposition`, -`dose_form`, -`environment`, -`environment_location`, -`ethnic_group`, -`event`, -`finding`, -`geographic_location`, -`inactive_concept`, -`intended_site`, -`life_style`, -`link_assertion`, -`linkage_concept`, -`medicinal_product`, -`medicinal_product_form`, -`metadata`, -`morphologic_abnormality`, -`namespace_concept`, -`navigational_concept`, -`observable_entity`, -`occupation`, -`organism`, -`owl_metadata_concept`, -`person`, -`physical_force`, -`physical_object`, -`procedure`, -`product`, -`product_name`, -`qualifier_value`, -`racial_group`, -`record_artifact`, -`regime_therapy`, -`release_characteristic`, -`religion_philosophy`, -`role`, -`situation`, -`snomed_rt_ctv3`, -`social_concept`, -`special_concept`, -`specimen`, -`staging_scale`, -`state_of_matter`, -`substance`, -`supplier`, -`transformation`, -`tumor_staging`, -`unit_of_presentation` - -In the metadata hierarchy, the use of a hierarchy tag alone would not distinguish concepts finely enough, as lots of them will have eg. "foundation metadata concept" set as their tag. In these cases, concept identifiers may be used as the icon identifier. - -- `subclassDefinitionStatus` - -{% hint style="warning" %} -**Currently unsupported.** Indicates whether a parent concept's direct descendants form a [disjoint union](https://www.w3.org/TR/owl2-syntax/#Disjoint_Union_of_Class_Expressions)🌎 in OWL 2 terms; when set to `DISJOINT_SUBCLASSES`, child concepts are assumed to be pairwise disjoint and together cover all possible cases of the parent concept. - -The default value is `NON_DISJOINT_SUBCLASSES` where no such assumption is made. -{% endhint %} - -### Property expansion - -Core component information related to the current concept can be attached to the response by using the `expand` query parameter, allowing clients to retrieve more data in a single roundtrip. Property expansion runs the necessary requests internally, and attaches results to the original response object. - -Expand options are expected to appear in the form of `propertyName1(option1: value1, option2: value2, expand(...)), propertyName2()` where: - -- `propertyNameN` stands for the property to expand; -- `optionN: valueN` are key-value pairs providing additional filtering for the expanded property; -- optionally, `expand`s can be nested, and the options will apply to the components returned under the parent property; -- when no expand options are given, an empty set of `()` parentheses need to be added after the property name. - -Supported expandable property names are: - -#### `referenceSet()` - -Expands reference set metadata and content, available on [identifier concepts](https://confluence.ihtsdotools.org/display/DOCRFSPG/4.2.1.+Reference+Set+Identification)🌎. - -If a corresponding reference set was already created for an identifier concept (a subtype of `900000000000455006|Reference set`), information about the reference set will appear in the response: - -```json -GET /snomedct/MAIN/concepts/900000000000497000?expand=referenceSet() // CTV3 simple map -{ - "id": "900000000000497000", - "active": true, - [...] - "referenceSet": { - "id": "900000000000497000", - "released": true, - "active": true, - "effectiveTime": "20020131", - "moduleId": "900000000000012004", - "iconId": "900000000000496009", - "type": "SIMPLE_MAP", // Reference set type - "referencedComponentType": "concept", // Referenced component type - "mapTargetComponentType": "__UNKNOWN__" // Map target component type - // (applicable to map type reference sets only) - }, - [...] -} -``` - -Note that the response object for property `referenceSet` can also be retrieved directly using the [Reference Sets API](refsets.md). - -To retrieve reference set members along with the reference set in a single request, use a nested `expand` property named `members`: - -```json -GET /snomedct/MAIN/concepts/900000000000497000?expand=referenceSet(expand(members())) -{ - "id": "900000000000497000", - [...] - "referenceSet": { - [...] - "type": "SIMPLE_MAP", - "referencedComponentType": "concept", - "mapTargetComponentType": "__UNKNOWN__", - "members": { - "items": [ - { - "id": "00000193-e889-4d3f-b07f-e0f45eb77940", - "released": true, - "active": true, - "effectiveTime": "20190131", - "moduleId": "900000000000207008", - "iconId": "776792002", - "referencedComponent": { - "id": "776792002" - }, - "refsetId": "900000000000497000", // Reference set ID matches the identifier concept's ID - // for all members of the reference set - "referencedComponentId": "776792002", - "mapTarget": "XV8E7" - }, - [...] - ], - "searchAfter": "AoE_BTAwMDcyYWIzLWM5NDgtNTVhYy04MTBkLTlhOGNhMmU5YjQ5Yg==", - "limit": 50, - "total": 481508 - } - }, -} -``` - -Reference set members can also be fetched via the [SNOMED CT Reference Set Member API](refsets.md). - -#### `preferredDescriptions()` - -Expands descriptions with preferred acceptability. - -Returns all active descriptions that have at least one active language reference set member with an acceptabilityId of `900000000000548007|Preferred|`, in compact form, along with the concept. Preferred descriptions are frequently used on UIs when a display label is required for a concept. - -This information is also returned when expand options `pt()` or `fsn()` (described later) are present. - -```json -GET /snomedct/MAIN/2011-07-31/concepts/86299006?expand=preferredDescriptions() -{ - "id": "86299006", // Concept SCTID - [...] - "preferredDescriptions": { - "items": [ - { - "id": "828532012", // Description SCTID - "term": "Tetralogy of Fallot (disorder)", // Description term - "concept": { - "id": "86299006" - }, - "type": { - "id": "900000000000003001" - }, - "typeId": "900000000000003001", // Type: Fully Specified Name - "conceptId": "86299006", // "conceptId" matches the returned concept's SCTID - "acceptability": { - "900000000000509007": "PREFERRED", // Acceptability in reference set "US English" - "900000000000508004": "PREFERRED" // Acceptability in reference set "GB English" - } - }, - { - "id": "143123019", - "term": "Tetralogy of Fallot", - "concept": { - "id": "86299006" - }, - "type": { - "id": "900000000000013009" - }, - "typeId": "900000000000013009", // Type: Synonym - "conceptId": "86299006", - "acceptability": { - "900000000000509007": "PREFERRED", - "900000000000508004": "PREFERRED" - } - } - ], - "limit": 2, - "total": 2 - }, - [...] -} -``` - -#### `semanticTags()` - -Returns hierarchy tags extracted from FSNs. - -An array containing the hierarchy tags from all Fully Specified Name-typed descriptions of the concept is added as an expanded property if this option is present: - -```json -GET /snomedct/MAIN/concepts/103981000119101?expand=preferredDescriptions(),semanticTags() -{ - "id": "103981000119101", - "released": true, - "active": true, - "effectiveTime": "20200131", - "preferredDescriptions": { - "items": [ - { - "id": "3781804016", - "term": "Proliferative retinopathy following surgery due to diabetes mellitus (disorder)", - [...] - }, - [...] - ] - } - [...] - "semanticTags": [ "disorder" ], // Extracted from the Fully Specified Name; see term above - [...] -} -``` - -#### `inactivationProperties()` - -Collects information from concept inactivation indicator and historical association reference set members referencing this concept. - -Members of `900000000000489007|Concept inactivation indicator attribute value reference set|` and subtypes of `900000000000522004 |Historical association reference set|` hold information about a reason a concept is being retired in a release, as well as suggest potential replacement(s) for future use. - -The concept stating the reason for inactivation is placed under `inactivationProperties.inactivationIndicator.id` (a short-hand property exists without an extra nesting, named `inactivationProperties.inactivationIndicatorId`). It is expected that only a single active inactivation indicator exists for an inactive concept. - -Historical associations are returned under the property `inactivationProperties.associationTargets` as an array of objects. Each object includes the identifier of the historical association reference set and the target component identifier, in the same manner as described above – as an object with a single `id` property and as a string value. - -```json -GET /snomedct/MAIN/concepts/99999003?expand=inactivationProperties() -{ - "id": "99999003", - "active": false, - "effectiveTime": "20090731", - [...] - "inactivationProperties": { - "inactivationIndicator": { - "id": "900000000000487009" - }, - "associationTargets": [ - { - "referenceSet": { - "id": "900000000000524003" - }, - "targetComponent": { - "id": "416516009" - }, - "referenceSetId": "900000000000524003", // MOVED TO association reference set - "targetComponentId": "416516009" // Extension Namespace 1000009 - } - ], - "inactivationIndicatorId": "900000000000487009" // Moved elsewhere - }, - [...] -} -``` - -{% hint style="warning" %} -While most object values where a single `id` key is present indicate that the property can be expanded to a full resource representation, this is currently **not supported** for inactivation properties; an expand option of `inactivationProperties(expand(inactivationIndicator()))` will not retrieve additional data for the indicator concept. -{% endhint %} - -#### `members()` - -Expands reference set members referencing this concept. - -Note that this is different from reference set member expansion on a reference set, ie. `referenceSet(expand(members()))`, as this option will return reference set members where the `referencedComponentId` property matches the concept SCTID, from multiple reference sets (if permitted by other expand options). Inactivation and historical association members can also be returned here, in their entirety (as opposed to the summarized form described in `inactivationProperties()` above). - -Reference set members can also be fetched in a "standalone" fashion via the [SNOMED CT Reference Set Member API](refsets.md). - -Compare the output with the one returned when inactivation indicators were expanded. The last two reference set members correspond to the historical association and the inactivation reason, respectively: - -```json -GET /snomedct/MAIN/concepts/99999003?expand=members() -{ - "id": "99999003", - [...] - "members": { - "items": [ - { - "id": "f2b12ff9-794a-5a05-8027-88f0492f3766", - "released": true, - "active": true, - "effectiveTime": "20020131", - "moduleId": "900000000000207008", - "iconId": "99999003", - "referencedComponent": { - "id": "99999003" - }, - "refsetId": "900000000000497000", // CTV3 simple map - "referencedComponentId": "99999003", // all referencedComponentIds match the concept's SCTID - "mapTarget": "XUPhG" // additional properties are displayed depending on the - // reference set type - }, - { - "id": "5e9787df-11af-54ed-ae92-0ea3bc83f2ac", - "released": true, - "active": true, - "effectiveTime": "20090731", - "moduleId": "900000000000207008", - "iconId": "99999003", - "referencedComponent": { - "id": "99999003" - }, - "refsetId": "900000000000524003", // MOVED TO association reference set - "referencedComponentId": "99999003", - "targetComponentId": "416516009" // Extension Namespace 1000009 - }, - { - "id": "9ffd949a-27d0-5811-ad48-47ff43e1bded", - "released": true, - "active": true, - "effectiveTime": "20090731", - "moduleId": "900000000000207008", - "iconId": "99999003", - "referencedComponent": { - "id": "99999003" - }, - "refsetId": "900000000000489007", // Concept inactivation indicator reference set - "referencedComponentId": "99999003", - "valueId": "900000000000487009" // Moved elsewhere - } - ], - "limit": 3, - "total": 3 - }, - [...] -} -``` - -The following expand options are supported within `members(...)`: - -- `active: true | false` - -Controls whether only active or inactive reference set members should be returned. - -- `refSetType: "{type}" | [ "{type}"(,"{type}")* ]` - -The reference set type(s) as a string, to be included in the expanded output; when multiple types are accepted, values must be enclosed in square brackets and separated by a comma. - -- `expand(...)` - -Allows nested expansion of reference set member properties. - -Allowed reference set type constants are (these are described in the [Reference Set Types](https://confluence.ihtsdotools.org/display/DOCRFSPG/5.+Reference+Set+Types)🌎 section of SNOMED International's "Reference Sets Practical Guide" and the [Reference Set Types](https://confluence.ihtsdotools.org/display/DOCRELFMT/5.2+Reference+Set+Types)🌎 section of "Release File Specification" in more detail): - -- `SIMPLE` - simple type -- `SIMPLE_MAP` - simple map type -- `LANGUAGE` - language type -- `ATTRIBUTE_VALUE` - attribute-value type -- `QUERY` - query specification type -- `COMPLEX_MAP` - complex map type -- `DESCRIPTION_TYPE` - description type -- `CONCRETE_DATA_TYPE` - concrete data type (vendor extension for representing concrete values in Snow Owl) -- `ASSOCIATION` - association type -- `MODULE_DEPENDENCY` - module dependency type -- `EXTENDED_MAP` - extended map type -- `SIMPLE_MAP_WITH_DESCRIPTION` - simple map type with map target description (vendor extension for storing a descriptive label with map targets, suitable for display) -- `OWL_AXIOM` - OWL axiom type -- `OWL_ONTOLOGY` - OWL ontology declaration type -- `MRCM_DOMAIN` - MRCM domain type -- `MRCM_ATTRIBUTE_DOMAIN` - MRCM attribute domain type -- `MRCM_ATTRIBUTE_RANGE` - MRCM attribute range type -- `MRCM_MODULE_SCOPE` - MRCM module scope type -- `ANNOTATION` - annotation type -- `COMPLEX_BLOCK_MAP` - complex map with map block type (added for national extension support) - -See the following example for combining reference set member status filtering and reference set type restriction: - -```json -GET /snomedct/MAIN/concepts/99999003?expand=members(active:true, refSetType:["ASSOCIATION","ATTRIBUTE_VALUE"]) -{ - "id": "99999003", - [...] - "members": { - [ - { - "id": "5e9787df-11af-54ed-ae92-0ea3bc83f2ac", - "released": true, - "active": true, - "effectiveTime": "20090731", - "moduleId": "900000000000207008", - "iconId": "99999003", - "referencedComponent": { - "id": "99999003" - }, - "refsetId": "900000000000524003", // MOVED TO association reference set - "referencedComponentId": "99999003", - "targetComponentId": "416516009" // Extension Namespace 1000009 - }, - { - "id": "9ffd949a-27d0-5811-ad48-47ff43e1bded", - "released": true, - "active": true, - "effectiveTime": "20090731", - "moduleId": "900000000000207008", - "iconId": "99999003", - "referencedComponent": { - "id": "99999003" - }, - "refsetId": "900000000000489007", // Concept inactivation indicator reference set - "referencedComponentId": "99999003", - "valueId": "900000000000487009" // Moved elsewhere - } - ], - "limit": 2, - "total": 2 - }, - [...] -} -``` - -#### `module()` - -Expands the concept's module identified by property `moduleId`, and places it under the property `module`. As the returned resource is a concept itself, property expansion can apply to modules as well by using a nested `expand()` option. - -{% hint style="warning" %} -Property `module` does not appear in compact form (with a single `id` key) in the standard representation. -{% endhint %} - -```json -GET /snomedct/MAIN/concepts/138875005?expand=module() -{ - "id": "138875005", - "active": true, - [...] - // The moduleId of the requested concept - "moduleId": "900000000000207008", - "module": { // Expanded module concept resource - "id": "900000000000207008", // SCTID matches 138875005's moduleId - "released": true, - "active": true, - "effectiveTime": "20020131", - // The moduleId of the module concept - "moduleId": "900000000000012004", - "iconId": "900000000000445007", - "definitionStatus": { - "id": "900000000000074008" - }, - "subclassDefinitionStatus": "NON_DISJOINT_SUBCLASSES", - "ancestorIds": [...], - [...] - "definitionStatusId": "900000000000074008" - }, - [...] - "definitionStatusId": "900000000000074008" -} -``` - -#### `definitionStatus()` - -Expands the definition status concept identified by the property `definitionStatusId`, and places it under the property `definitionStatus`. When this property is not expanded, a smaller placeholder object with a single `id` property is returned in the response. Nested `expand()` options work the same way as in the case of `module()`. - -```json -GET /snomedct/MAIN/concepts/138875005?expand=definitionStatus() -{ - "id": "138875005", - "active": true, - // The definitionStatusId of the requested concept - "definitionStatusId": "900000000000074008", - "definitionStatus": { // Expanded definition status concept resource - "id": "900000000000074008", // SCTID matches 138875005's definitionStatusId - "active": true, - "effectiveTime": "20020131", - [...] - // The definitionStatusId of the definition status concept - "definitionStatusId": "900000000000074008" - }, - [...] -} -``` - -#### `pt()` and `fsn()` - -Expands the [Preferred Term](https://confluence.ihtsdotools.org/display/DOCEG/Preferred+Term)🌎 (**PT** for short) and the [Fully Specified Name](https://confluence.ihtsdotools.org/display/DOCEG/Fully+Specified+Name)🌎 (**FSN** for short) of the concept, respectively. - -These descriptions are language context-dependent; the use of certain descriptions can be preferred in one dialect and acceptable or discouraged in others. The final output is controlled by the [Accept-Language](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language)🌎 request header, which clients can use to supply a list of locales in order of preference. - -In addition to the standard locales like `en-US`, Snow Owl uses an extension to allow referring to language reference sets by identifier, in the form of `{language code}-x-{language reference set ID}`. "Traditional" language tags are resolved to language reference set IDs as part of executing the request by consulting the code system settings: - -```json -GET /codesystems/SNOMEDCT-UK-CL -{ - "id": "SNOMEDCT-UK-CL", - "title": "SNOMED CT UK Clinical Extension", - [...] - "settings": { - "languages": [ - { - "languageTag": "en", // the language tag - "languageRefSetIds": [ // the corresponding language reference sets, in order of preference - "900000000000509007", - "900000000000508004", - "999001261000000100", - "999000691000001104" - ] - }, - { - "languageTag": "en-us", - "languageRefSetIds": [ - "900000000000509007" - ] - }, - { - "languageTag": "en-gb", - "languageRefSetIds": [ - "900000000000508004", - "999001261000000100", - "999000691000001104" - ] - }, - { - "languageTag": "en-nhs-pharmacy", - "languageRefSetIds": [ - "999000691000001104" - ] - }, - { - "languageTag": "en-nhs-clinical", - "languageRefSetIds": [ - "999001261000000100" - ] - } - ], - [...] - }, - [...] -} -``` - -An example response pair demonstrating cases where the PT is different in certain dialects: - -```json -GET /snomedct/MAIN/concepts/703247007?expand=pt() -// Accept-Language: en-US -{ - "id": "703247007", - [...] - "pt": { - "id": "3007370016", - "term": "Color", - [...] - "conceptId": "703247007", // conceptId matches the concept's SCTID - "acceptability": { - // Use of "Color" is preferred in the US English language reference set, - // but not acceptable in others - "900000000000509007": "PREFERRED" - } - }, - [...] -} -``` - -```json -GET /snomedct/MAIN/concepts/703247007?expand=pt() -// Accept-Language: en-x-900000000000508004 -{ - "id": "703247007", - [...] - "pt": { - "id": "3007469016", - "term": "Colour", - [...] - "conceptId": "703247007", - "acceptability": { - // Use of "Colour" is preferred in the GB English language reference set, - // but not acceptable in others - "900000000000508004": "PREFERRED" - } - }, - [...] -} -``` - -#### `descriptions()` - -Expands all descriptions associated with the concept, and adds them to a collection resource (that includes an element limit and a total hit count) under the property `descriptions`. These can also be retrieved separately by the use of the [SNOMED CT Description API](descriptions.md). - -{% hint style="warning" %} -The collection resource's `limit` and `total` values are set to the same value (the number of descriptions returned for the concept) because a description fetch limit can not be set via a property expand option. -{% endhint %} - -The following expand options are supported within `descriptions(...)`: - -- `active: true | false` - -Controls whether only active or inactive descriptions should be included in the response. (If both are required, do not set any value for this expand property.) - -- `typeId: "{expression}"` - -An ECL expression that restricts the `typeId` property of each returned description. The simplest expression is a single SCTID, eg. when this option has a value of `"900000000000013009"`, only [Synonyms](https://confluence.ihtsdotools.org/display/DOCEG/Synonym)🌎 will be expanded. - -- `sort: "{field}(:{asc | desc})?"(, "{field}(:{asc | desc})")*` - -Items in the collection resource are sorted based on the sort configuration given in this option. A single, comma-separated string value is expected; field names and sort order must be separated by a colon (`:`) character. When no sort order is given, ascending order (`asc`) is assumed. - -- `expand(...)` - -Allows nested expansion of description properties. - -```json -GET /snomedct/MAIN/concepts/86299006?expand=descriptions(active: true, sort: "term.exact:asc") -{ - "id": "86299006", - [...] - "descriptions": { - "items": [ - { - "id": "1235125018", - "released": true, - "active": true, - "effectiveTime": "20070731", - "moduleId": "900000000000207008", - "iconId": "900000000000013009", - "term": "Fallot's tetralogy", // Descriptions are sorted by term (case insensitive) - "semanticTag": "", - "languageCode": "en", - "caseSignificance": { - "id": "900000000000017005" - }, - "concept": { - "id": "86299006" - }, - "type": { - "id": "900000000000013009" - }, - "typeId": "900000000000013009", // Synonym - "conceptId": "86299006", // conceptId property matches the concept's SCTID - "caseSignificanceId": "900000000000017005", - "acceptability": { - "900000000000509007": "ACCEPTABLE", - "900000000000508004": "ACCEPTABLE" - } - }, - { - "id": "143125014", - "active": true, - "term": "Subpulmonic stenosis, ventricular septal defect, overriding aorta, AND right ventricular hypertrophy", - [...] - }, - { - "id": "143123019", - "active": true, - "term": "Tetralogy of Fallot", - [...] - }, - { - "id": "828532012", - "active": true, - "term": "Tetralogy of Fallot (disorder)", - "typeId": "900000000000003001", // Fully Specified Name - [...] - }, - { - "id": "1235124019", - "active": true, - "term": "TOF - Tetralogy of Fallot", - [...] - } - ], - "limit": 5, - "total": 5 - }, - [...] -} -``` - -#### `relationships()` - -Retrieves all "outbound" relationships, where the `sourceId` property matches the SCTID of the concept(s), adding them to a property named `relationships` as a collection resource object. The same set of relationships can also be retrieved in standalone form via Snow Owl's [SNOMED CT Relationship API](relationships.md). - -{% hint style="warning" %} -`limit` and `total` values on `relationships` are set to the same value (the number of relationships returned for the concept) because a relationship fetch limit can not be set via an expand option. -{% endhint %} - -The following expand options are supported within `relationships(...)`: - -- `active: true | false` - -Controls whether only active or inactive relationships should be included in the response. (If both are required, do not set any value for this expand property.) - -- `characteristicTypeId: "{expression}"` - -An ECL expression that restricts the `characteristicTypeId` property of each returned relationship. As an example, when this value is set to `"<<900000000000006009"`, both stated and inferred relationships will be returned, as their characteristic type concepts are descendants of `900000000000006009|Defining relationship|`. - -- `typeId: "{expression}"` - -An ECL expression that restricts the `typeId` property of each returned relationship. - -- `destinationId: "{expression}"` - -An ECL expression that restricts the `destinationId` property of each returned relationship. - -- `sort: "{field}(:{asc | desc})?"(, "{field}(:{asc | desc})")*` - -Items in the collection resource are sorted based on the sort configuration given in this option. A single, comma-separated string value is expected; field names and sort order must be separated by a colon (`:`) character. When no sort order is given, ascending order (`asc`) is assumed. - -- `expand(...)` - -Allows nested expansion of relationship properties. - -```json -GET /snomedct/MAIN/concepts/404684003?expand=relationships(active: true) -{ - "id": "404684003", // Clinical finding - "active": true, - [...] - "relationships": { - "items": [ - { - "id": "2472459022", - "released": true, - "active": true, - "effectiveTime": "20040131", - "moduleId": "900000000000207008", - "iconId": "116680003", - "destinationNegated": false, - "relationshipGroup": 0, - "unionGroup": 0, - "characteristicType": { - "id": "900000000000011006" - }, - "modifier": { - "id": "900000000000451002" - }, - "source": { - "id": "404684003" - }, - "type": { - "id": "116680003" - }, - "destination": { - "id": "138875005" - }, - "typeId": "116680003", - "modifierId": "900000000000451002", - "sourceId": "404684003", // sourceId property matches concept's SCTID - "destinationId": "138875005", - "characteristicTypeId": "900000000000011006" - } - ], - "limit": 1, - "total": 1 - }, - [...] -} -``` - -#### `inboundRelationships()` - -Retrieves all "inbound" relationships, where the `destinationId` property matches the SCTID of the concept(s), adding them to property `inboundRelationships`. - -{% hint style="warning" %} -`limit` and `total` values on `inboundRelationships` are set to the same value (the number of inbound relationships returned for the concept), but differently from options above, **a fetch limit is applied** when it is specified. -{% endhint %} - -The same set of options are supported within `inboundRelationships` as in `relationships` (see [above](#relationships)), with three important differences: - -- ~~`destinationId: "{expression}"`~~ - -This option is not supported on `inboundRelationships`; all destination IDs match the concept's SCTID. - -- `sourceId: "{expression}"` - -An ECL expression that restricts the `sourceId` property of each returned relationship. - -- `limit: {limit}` - -Limits the maximum number of inbound relationships to be returned. Not recommended for use when the expand option applies to a collection of concepts, not just a single one, as the limit is not applied individually for each concept. - -#### `descendants()` / `statedDescendants()` - -Depending on which `direct` setting is used, retrieves all concepts whose `[stated]parentIds` and/or `[stated]AncestorIds` array contains this concept's SCTID. Results are added to property `descendants` or `statedDescendants`, based on the option name used. - -Only active concepts are returned, as these are expected to have active "IS A" relationships or OWL axioms that describe the relative position of the concept within the terminology graph. - -The following options are available: - -- `direct: true | false` (required) - -Controls whether only direct descendants should be collected or a transitive closure of concept subtypes. - -When set to `true`, property `[stated]parentIds` will be searched only, otherwise both `[stated]parentIds` and `[stated]AncestorIds` are used. The presence or absence of the "stated" prefix in the search field depends on the option name. - -- `limit: 0` - -Applicable only when a single concept's properties are expanded. Collects the number of descendants in an efficient manner, and sets the `total` property of the returned collection resource without including any concepts in it. **Not used when a collection of concepts are expanded in a single request, or any other value is given.** - -- `expand(...)` - -Allows nested expansion of concept properties on each collected descendant. - -```json -GET /snomedct/MAIN/concepts/138875005?expand=descendants(direct: true) -{ - "id": "138875005", // SNOMED CT Concept - "active": true, - [...] - "descendants": { - "items": [ - { - "id": "105590001", // Substance - "released": true, - "active": true, - "effectiveTime": "20020131", - "moduleId": "900000000000207008", - "iconId": "substance", - "definitionStatus": { - "id": "900000000000074008" - }, - "subclassDefinitionStatus": "NON_DISJOINT_SUBCLASSES", - "ancestorIds": [ - "-1" - ], - "parentIds": [ - "138875005" // parentIds contains SNOMED CT Concept's SCTID, meaning this concept - // is a direct (inferred) descendant of it - ], - "statedAncestorIds": [ - "-1" - ], - "statedParentIds": [ - "138875005" - ], - "definitionStatusId": "900000000000074008" - }, - [...] - ], - "limit": 50, - "total": 19 // Total number of descendants - }, - [...] -} -``` - -#### `ancestors()` / `statedAncestors()` - -Depending on which `direct` setting is used, retrieves all concepts that appear in this concept's `[stated]parentIds` and/or `[stated]AncestorIds` array. Results are added to property `ancestors` or `statedAncestors`, based on the option name used. - -The following options are available: - -- `direct: true | false` (required) - -Controls whether only direct ancestors should be collected or a transitive closure of concept supertypes. - -When set to `true`, property `[stated]parentIds` will be used only for concept retrieval, otherwise the union of `[stated]parentIds` and `[stated]AncestorIds` are collected (the special placeholder value "-1" is ignored). The presence or absence of the "stated" prefix in the search field depends on the option name. - -- `limit: 0` - -Collects the number of ancestors in an efficient manner, and sets the `total` property of the returned collection resource without including any concepts in it. **Not used when any other value is given** (however, this property expansion supports cases where multiple concepts' ancestors need to be returned). - -- `expand(...)` - -Allows nested expansion of concept properties on each collected ancestor. - -## Operations - -### Read concept (GET) - -A GET request that includes a concept identifier as its last path parameter will return information about the concept in question: - -```json -GET /snomedct/MAIN/2019-07-31/concepts/138875005 -``` - -#### **Query parameters** - -- `expand={options}` - -Concept properties that should be returned along with the original request, as part of the concept resource. See available options in section [Property expansion](#property-expansion) above. - -- `field={field1}[,{fieldN}]*` - -Restricts the set of fields returned from the index. Results in a smaller response object when only specific information is needed. - -Supported names for field selection are the following: - -- `active` -- `activeMemberOf` -- `ancestors` - controls the appearance of `ancestorIds` as well -- `definitionStatusId` -- `doi` -- `effectiveTime` -- `exhaustive` -- `iconId` -- `id` - always included in the response, even when not present as a `field` parameter -- `mapTargetComponentType` -- `memberOf` -- `moduleId` -- `namespace` -- `parents` - controls the appearance of `parentIds` as well -- `preferredDescriptions` -- `refSetType` -- `referencedComponentType` -- `released` -- `score` -- `semanticTags` -- `statedAncestors` - controls the appearance of `statedAncestorIds` as well -- `statedParents` - controls the appearance of `statedParentIds` as well -- ~~`created`~~ and ~~`revised`~~ - these fields are associated with revision control, and even though they are listed as supported fields, they do not appear in the response even when explicitly requested. - -Specifying any other field name results in a `400 Bad Request` response: - -```json -GET /snomedct/MAIN/2019-07-31/concepts/138875005?field=xyz -{ - "status": 400, - "code": 0, - "message": "Unrecognized concept model property '[xyz]'.", - "developerMessage": "Supported properties are '[active, activeMemberOf, ancestors, ...]'.", - "errorCode": 0, - "statusCode": 400 -} -``` - -Fields with a value of `null` do not appear in the response, even if they are selected for inclusion. - -```json -GET /snomedct/MAIN/2019-07-31/concepts/138875005?field=id,active,score -{ - "id": "138875005", - "active": true - // score was not calculated, and so is not present -} -``` - -#### **Request headers** - -- `Accept-Language: {language-range}[;q={weight}](, {language-range}[;q={weight}])*` - -Controls the logic behind Preferred Term and Fully Specified Name selection for the concept. See the documentation for expand options [pt() and fsn()](#pt-and-fsn) for details. - -Specifying an unknown language or dialect results in a `400 Bad Request` response: - -```json -GET /snomedct/MAIN/2019-07-31/concepts/138875005?expand=fsn() -// Accept-Language: hu-HU -{ - "status": 400, - "code": 0, - "message": "Don't know how to convert extended locale [hu-hu] to a language reference set identifier.", - "developerMessage": "Input representation syntax or validation errors. Check input values.", - "errorCode": 0, - "statusCode": 400 -} -``` - -### Find concepts (GET) - -A GET request that ends with `concepts` as its last path parameter will search for concepts matching all of the constraints supplied as query parameters. By default (when no query parameter is added) it returns all concepts. - -The response consists of a collection of concept resources, a `searchAfter` key (described in section "Query parameters" below), the limit used when computing response items and the total hit count: - -```json -GET /snomedct/SNOMEDCT/2021-01-31/concepts -{ - "items": [ - { - "id": "100000000", // Each item represents a concept resource - "released": true, - "active": false, - "effectiveTime": "20090731", - "moduleId": "900000000000207008", - "iconId": "138875005", - "definitionStatus": { - "id": "900000000000074008" - }, - "subclassDefinitionStatus": "NON_DISJOINT_SUBCLASSES", - "ancestorIds": [], - "parentIds": [ - "-1" - ], - "statedAncestorIds": [], - "statedParentIds": [ - "-1" - ], - "definitionStatusId": "900000000000074008" - }, - [...] // at most 50 items are returned when no limit is specified - ], - "searchAfter": "AoEpMTAwMDQyMDAz", // key can be used for paged results - "limit": 50, // the limit given in the original request - // (or the default limit if not specified) - "total": 481509 // the total number of concept matches -} -``` - -#### **Query parameters** - -- `definitionStatus={eclExpression} | {id1}[,{idN}]*` - -An ECL expression or enumerated list that describes the allowed set of SCTIDs that must appear in matching concepts' `definitionStatusId` property. Since there are only two values used, `900000000000074008|Primitive|` and `900000000000073002|Defined|` for primitive and fully defined concepts, respectively, a single SCTID is usually entered here. - -- `ecl={eclExpression}` - -Restricts the returned set of concepts to those that match the specified ECL expression. The query parameter can be used on its own for evaluation of expressions, or in combination with other query parameters. Expressions conforming to the short form of ECL 1.5 syntax are accepted. The expression is evaluated over the [inferred view](https://confluence.ihtsdotools.org/display/DOCGLOSS/Inferred+view)🌎, based on the currently persisted inferred relationships. - -{% hint style="warning" %} -As ECL syntax uses special symbols, query parameters should be encoded to URL-safe characters. The examples in this section are using the cleartext form for better readability. -{% endhint %} - -```json -GET /snomedct/SNOMEDCT/2021-01-31/concepts?ecl=<<404684003|Clinical finding|:363698007|Finding site|=40238009|Hand joint structure| -{ - "items": [ - [...] - { - "id": "129157005", - "active": true, - [...] - "pt": { - "id": "2664900016", - "term": "Traumatic dislocation of joint of hand", // Concept match based on ECL expression - [...] - }, - [...] - }, - [...] - ], - "searchAfter": "AoEpNDQ4NDUzMDA0", - "limit": 50, - "total": 58 -} -``` - -- `statedEcl={eclExpression}` - -Same as `ecl`, but the input expression is evaluated over the [stated view](https://confluence.ihtsdotools.org/display/DOCGLOSS/stated+view)🌎 by using stated relationships (if present) and OWL axioms for evaluation. - -- `semanticTag={tag1}[,{tagN}]*` - -Filters concepts by a comma-separated list of allowed hierarchy tags. Matching concepts can have any of the supplied tags present (at least one) on their Fully Specified Names. - -- `term={searchTerm}` - -Matching concepts must have an active description whose term matches the string specified here. The search is executed in "smart match" mode; the following examples show which search expresssions match which description terms: - -``` -Search term → Term of matched description ------------------ --------------------------- -"Ångström" "angstrom" (case insensitive, ASCII-folding) -"sys blo pre" "Systolic blood pressure" (prefix of each word, matching order) -"broken arm" "Fracture of arm" (synonym filter, ignored stopwords) -"greenstick frac" "Greenstick fracture" (prefix match for final query keyword, - exact match for all others) -``` - -- `descriptionType={eclExpression} | {id1}[,{idN}]*` - -Restricts the result set by description type; matches must have at least one active description whose `typeId` property is included in the evaluated ECL result set or SCTID list. It is typically used in combination with `term` (see above) to control which type of descriptions should be matched by term. - -- `parent={id1}[,{idN}]*` -- `statedParent={id1}[,{idN}]*` -- `ancestor={id1}[,{idN}]*` -- `statedAncestor={id1}[,{idN}]*` - -Filters concepts by hierarchy. All four query parameters accept a comma-separated list of SCTIDs; the result set will contain direct descendants of the specified values in the case of `parent` and `statedParent`, and a transitive closure of descendants for `ancestor` and `statedAncestor` (including direct children). Parameters starting with `stated...` will use the stated IS A hierarchy for computations. - -```json -GET /snomedct/SNOMEDCT/2021-01-31/concepts?parent=138875005&field=id -{ - "items": [ - // Inferred direct descendants of 138875005|Snomed CT Concept| - { "id": "105590001" }, // Substance - { "id": "123037004" }, // Body structure - { "id": "123038009" }, // Specimen - [...] - ], - "searchAfter": "AoEyOTAwMDAwMDAwMDAwNDQxMDAz", - "limit": 50, - "total": 19 // 19 top-level concepts returned in total -} -``` - -- `doi=true | false` - -Controls whether relevance-based sorting should take **Degree of Interest** (DOI for short) into account. When enabled, concepts that are used frequently in a clinical environment are favored over concepts with a lower likelihood of use. - -- `namespace={namespaceIdentifier}` -- `namespaceConceptId={id1}[,{idN}]*` - -The SCTID of matching concepts must have the specified 7-digit [namespace identifier](https://confluence.ihtsdotools.org/display/DOCRELFMT/6.6+Namespace-Identifier)🌎, eg. `1000154`. When matching by namespace concept ID, a comma-separated list of SCTIDs are expected, and the associated 7-digit identifier will be extracted from the active FSNs of each concept entered here. - -```json -GET /snomedct/SNOMEDCT-UK-CL/concepts?namespaceConceptId=370138007&field=id -{ - "items": [ - // Concept IDs with a namespace identifier of "1000001", corresponding to - // namespace concept 370138007|Extension Namespace {1000001}| - { - "id": "999000011000001104" // 99900001>>1000001<<104 - }, - [...] - ], - "searchAfter": "AoEyOTk5MDAwODcxMDAwMDAxMTAy", - "limit": 50, - "total": 4 -} -``` - -- `isActiveMemberOf={eclExpression} | {id1}[,{idN}]*` - -This filter accepts either a single ECL expression, or a comma-separated list of reference set SCTIDs. For each matching concept at least one active reference set member must exist where the `referenceComponentId` points to the concept and the `referenceSetId` property is listed in the filter, or is a member of the evaluated ECL expression's result set. - -- `effectiveTime={yyyyMMdd} | Unpublished` - -Filters concepts by effective time. The query parameter accepts a single effective time in `yyyyMMdd` (short) format, or the literal `Unpublished` when searching for concepts that have been modified since they were last published as part of a code system version. - -Note that only the concept's effective time is taken into account, not any of its related core components (descriptions, relationships) or reference set members. If the concept's status, definition status or module did not change since the last release, its effective time will not change either. - -{% hint style="warning" %} -When searching for `Unpublished` concepts, the `effectiveTime` property will not appear on returned concept resources, as the value is `null` for all unpublished components. -{% endhint %} - -```json -GET /snomedct/SNOMEDCT/2021-01-31/concepts?effectiveTime=20170131&field=id,effectiveTime -{ - "items": [ - { - "id": "10151000132103", - "effectiveTime": "20170131" // Concept effective time matches query parameter - }, - { - "id": "10231000132102", - "effectiveTime": "20170131" - }, - [...] - ], - "searchAfter": "AoEwMTA3NTQ3MTAwMDExOTEwNw==", - "limit": 50, - "total": 5580 // Total number of concepts with effective time 2017-01-31 -} -``` - -- `active=true | false` - -Filters concepts by status. When set to `true`, only active concepts are added to the resulting collection, while a value of `false` collects inactive concepts only. (If both active and inactive concepts should be returned, do not add this parameter to the query.) - -- `module={eclExpression} | {id1}[,{idN}]*` - -Filters concepts by `moduleId`. The query parameter accepts either a single ECL expression, or a comma-separated list of module SCTIDs; concepts must have a `moduleId` property that is included in the ID list or the evaluated ECL result. - -- `id={id1}[,{idN}]*` - -Filters concepts by SCTID. The parameter accepts a comma-separated list of IDs; matching concepts must have an `id` property that matches any of the specified identifiers. - -- `sort: "{field}(:{asc | desc})?"(, "{field}(:{asc | desc})")*` - -Sorts returned concept resources based on the sort configuration given in this parameter. Field names and sort order must be separated by a colon (`:`) character. When no sort order is given, ascending order (`asc`) is assumed. - -Field names supported for sorting are the same that are used for field selection; please see [above](#retrieve-single-concept-by-id-get) for the complete list. - -{% hint style="warning" %} -The default behavior is to sort results by `id`, in ascending order. SCTIDs are sorted lexicographically, not as numbers; this means that eg. `10683591000119104` will appear before `10724008`, as their first two digits are the same, but the third digit is smaller in the former identifier. -{% endhint %} - -- `limit={limit}` - -Controls the maximum number of items that should be returned in the collection. When not specified, the default limit is `50` items. - -- `searchAfter={searchAfter}` - -Supports **keyset pagination**, ie. retrieving the next page of items based on the response for the current page. To use, set `limit` to the number of items expected on a single page, then run the first search request without setting a `searchAfter` key. The returned response will include the value to be inserted into the next request: - -```json -GET /snomedct/SNOMEDCT/2021-01-31/concepts?effectiveTime=20170131&field=id,effectiveTime -{ - "items": [ - { - "id": "10151000132103", - "effectiveTime": "20170131" - }, - { - "id": "10231000132102", - "effectiveTime": "20170131" - }, - [...] - ], - // Key to use in the request for the second page - "searchAfter": "AoEwMTA3NTQ3MTAwMDExOTEwNw==", - "limit": 50, - "total": 5580 -} - -GET /snomedct/SNOMEDCT/2021-01-31/concepts?effectiveTime=20170131&field=id,effectiveTime&searchAfter=AoEwMTA3NTQ3MTAwMDExOTEwNw== -{ - "items": [ - // List continues from the last item of the previous request - // (but the item itself is not included) - { - "id": "1075481000119105", - "effectiveTime": "20170131" - }, - { - "id": "10759271000119104", - "effectiveTime": "20170131" - }, - [...] - ], - // Different key returned for the third page - "searchAfter": "AoEwMTA4MTgxMTAwMDExOTEwNw==", - "limit": 50, - "total": 5580 -} -``` - -The process can be repeated until the `items` array turns up empty, indicating that there are no more pages to return. - -{% hint style="warning" %} -`searchAfter` keys should be considered opaque; they can not be constructed to jump to an arbitrary point in the enumeration. Keyset pagination also doesn't handle cases gracefully where eg. concepts with "smaller" SCTIDs are inserted while pages are retrieved from the server. If a consistent result set is expected, a [point-in-time](#path-with-timestamp) path parameter should be used in consecutive search requests. -{% endhint %} - -- `expand={options}` - -Concept properties that should be returned along with the original request, as part of the concept resource. See available options in section [Property expansion](#property-expansion) above. - -- `field={field1}[,{fieldN}]*` - -Restricts the set of fields returned from the index. Results in a smaller response object when only specific information is needed. See [above](#retrieve-single-concept-by-id-get) for the list of supported field names. - -#### **Request headers** - -- `Accept-Language: {language-range}[;q={weight}](, {language-range}[;q={weight}])*` - -Controls the logic behind Preferred Term and Fully Specified Name selection for returned concepts. See the documentation for expand options [pt() and fsn()](#pt-and-fsn) for details. - -### Find concepts (POST) - -POST requests submitted to `concepts/search` perform the same search operation as described for the GET request above, but each query parameter is replaced by a property in the JSON request body: - -```json -POST /snomedct/SNOMEDCT/2021-01-31/concepts/search -// Request body -{ - // Query parameters allowing multiple values must be passed as arrays - "expand": [ "pt()" ], - "field": [ "id", "preferredDescriptions" ], - "limit": 100, - "active": true, - "module": [ "900000000000012004" ] -} - -// Response -{ - "items": [ - { - "id": "1003316002", - "moduleId": "900000000000012004", - "pt": { - "id": "4167978019", - "term": "Extension Namespace 1000256", - [...] - } - }, - { - "id": "1003317006", - "moduleId": "900000000000012004", - "pt": { - "id": "4167981012", - "term": "Extension Namespace 1000257", - [...] - } - } - ], - "searchAfter": "AoEqMTAwMzMxNzAwNg==", - "limit": 2, - "total": 1802 -} -``` - -#### **Request headers** - -- `Accept-Language: {language-range}[;q={weight}](, {language-range}[;q={weight}])*` - -Controls the logic behind Preferred Term and Fully Specified Name selection for returned concepts. See the documentation for expand options [pt() and fsn()](#pt-and-fsn) for details. - -### Create concept (POST) - -POST requests submitted to `concepts` create a new concept with the specified parameters, then commit the result to the terminology repository. - -The resource path typically consists of a single code system identifier for these requests, indicating that changes should go directly to the working branch of the code system, or a direct child of the working branch for isolating a set of changes that can be reviewed and merged in a single request. - -The request body needs to conform to the following requirements: - -- include at least one Fully Specified Name (FSN) -- include at least one preferred synonym (Preferred Term, PT) - -The SCTID of created components can be specified in two ways: - -1. Explicitly by setting the `id` property on the component object; the request fails when an existing component in the repository already has the same SCTID assigned to it; -2. Allowing the server to generate an identifier by leaving `id` unset and populating `namespaceId` with the expected namespace identifier, eg. `"1000154"`. Requests using `namespaceId` should not fail due to an SCTID collision, as generated identifiers are checked for uniqueness. - -When a `namespaceId` is set on the concept level, descriptions and relationships will use this value by default, so in this case neither `id` nor `namespaceId` needs to be set on them. The same holds true for `moduleId` – the concept's module identifier is applied to all related descriptions, relationships and reference set members in the request, unless it is set to a different value on the component object. - -Please see the example below for required properties. (Note that it is non-executable in its current form, as the OWL axiom reference set member can not be created without knowing the concept's SCTID in advance.) - -A successful commit will result in a `201 Created` response; the response header `Location` can be used to extract the generated concept identifier. Validation errors in the request body cause a `400 Bad Request` response. - -```json -// Create a concept on the working branch of code system SNOMEDCT-B2I -POST /snomedct/SNOMEDCT-B2I/concepts -// Request body -{ - "active": true, - "moduleId": "636635721000154103", // SNOMED CT B2i extension module - "namespaceId": "1000154", // B2i Healthcare's namespace identifier - "definitionStatusId": "900000000000074008", // Primitive - "descriptions": [ - // Create mandatory FSN and PT - { - "active": true, - // "moduleId", "namespaceId" will be set from the concept - // "id" will be generated for the description - // "conceptId" will be automatically populated with the new concept's SCTID - "typeId": "900000000000003001", // Fully specified name - "term": "Example concept (disorder)", - "languageCode": "en", - "caseSignificanceId": "900000000000448009", // Case insensitive - "acceptability": { - /* - Acceptability map entries are keyed by language reference set ID. - Allowed values are "PREFERRED" and "ACCEPTABLE". - */ - "900000000000509007": "PREFERRED" // US English - } - }, - { - "active": true, - "typeId": "900000000000013009", // Synonym - "term": "Example concept", - "languageCode": "en", - "caseSignificanceId": "900000000000448009", // Case insensitive - "acceptability": { - "900000000000509007": "PREFERRED" // US English - } - } - ], - "relationships": [ - /* - Including relationships on a new concept request is optional. - - However, when no inferred IS A relationship is created, the concept will not - be visible in the inferred hierarchy (and not show up in eg. ECL evaluations) - until a classification is run on the branch, and suggested changes are saved. - */ - { - "active": true, - // "moduleId", "namespaceId" will be set from the concept - // "id" will be generated for the relationship - // "sourceId" will be automatically populated with the new concept's SCTID - "typeId": "116680003", // IS A - "destinationId": "64572001", // Disease - "destinationNegated": false, - "relationshipGroup": 0, - "unionGroup": 0, - "characteristicTypeId": "900000000000011006", // Inferred relationship - "modifierId": "900000000000451002" // Some (existential restriction) - } - ], - "members": [ - { - // "id" is an UUID, will be automatically generated when not given - "active": true, - // "moduleId" needs to be set for reference set members; it is not propagated - "moduleId": "636635721000154103", - // "referencedComponentId" will be automatically populated with the new concept's SCTID - "refsetId": "733073007", - /* - Additional properties of the reference set should be added here. For an OWL - axiom reference set member, the property to the reference set type is called - "owlExpression". - - At the moment we can not create an OWL axiom member for concepts that do not include - a concept ID in advance. - */ - "owlExpression": "SubClassOf(: :64572001)" - } - ], - "commitComment": "Create new example concept" -} - -// Response: 201 Created -// Location: /snomedct/SNOMEDCT-B2I/concepts/ -``` - -#### **Request headers** - -- `X-Author: {author_id}` - -Changes the author recorded in the commit message from the authenticated user (default) to the specified user. - -### Update concept (PUT) - -PUT requests to locations that identify a concept resource (same as when [retrieving](#read-concept-get) concept content) will update the concept. Following a successful commit, the state of the concept on the branch should match the state received in the request body. - -The following properties can be updated on any component. If they are not included in the request, the corresponding component property remains unchanged. - -- `moduleId`: string -- `active`: boolean -- `effectiveTime`: string (in `YYYYmmdd`, "short" format) - -When [inactivating](https://confluence.ihtsdotools.org/display/DOCEG/Concept+Inactivation)🌎 a concept, an object named `inactivationProperties` can be added that can point to possible replacement concepts and/or specify the reason for inactivation: - -```json -PUT /snomed-ct/v3/SNOMEDCT/concepts/69949008 -// Request body -{ - "active": false, - "inactivationProperties": { - "inactivationIndicatorId": "900000000000482003", // Duplicate - "associationTargets": [ - { - "referenceSetId": "900000000000527005", // SAME AS association reference set - "targetComponentId": "273999003" // Neuroplasty - } - ] - }, - "commitComment": "Inactivate duplicate concept" -} - -// Response: 204 No Content -``` - -Specifying an empty string for `inactivationIndicatorId` will remove an existing indicator, while an empty array will delete historical association reference set members for the concept. This is handled automatically when the concept is re-activated, so `inactivationProperties` can be omitted from such requests entirely: - -```json -PUT /snomed-ct/v3/SNOMEDCT/concepts/69949008 -// Request body -{ - "active": true, - "commitComment": "Reactivate concept" -} -``` - -```json -GET /snomed-ct/v3/SNOMEDCT/concepts/69949008 -{ - "id": "69949008", - "active": true, - [...] - "inactivationProperties": { - "associationTargets": [] - }, - [...] -} - -// Response: 204 No Content -``` - -Properties that can be updated on the concept itself are: - -- `definitionStatusId`: string -- `subclassDefinitionStatus`: "DISJOINT_SUBCLASSES" | "NON_DISJOINT_SUBCLASSES" - -In addition to the above, core components and reference set members related to the concept in question can be updated in a single request by including any of the following properties: - -- `descriptions` -- `relationships` -- `members` - -Each of the above can hold a collection resource of the respective component resource type. These resources are described in detail in sections [Descriptions](descriptions.md), [Relationships](relationships.md) and [Reference set members](members.md), respectively. - -If a collection resource property is not included in the update request, the corresponding component type is unchanged. An empty array attempts to delete all existing related components. Otherwise, the components included in the collection are compared by SCTID/UUID to existing components, and it is decided whether: - -- a new component should be created (if the identifier did not appear previously in the terminology store) -- an existing component should be updated (if the identifier existed previously in the terminology store) -- an existing component should be deleted (if the identifier does not exist in the request, but existed previously in the terminology store) - -Successful updates return `204 No Content` from the server. Updates that attempt to modify the state of a missing or deleted concept result in a `404 Not Found` response. - -#### **Query parameters** - -- `force=true | false` - -Specifies whether updating the effective time of the concept should be allowed. The default value is `false`; in such cases, supplying an effective time property for the update is disallowed. The component's effective time after an update is computed automatically at all times, when the `force` property is set to `true`, this can be overridden externally. - -#### **Request headers** - -- `X-Author: {author_id}` - -Changes the author recorded in the commit message from the authenticated user (default) to the specified user. - -### Delete concept (DELETE) - -DELETE requests sent to a URI where the last path parameter is an existing concept ID will remove the concept and all of its associated components (descriptions, relationships, reference set members referring to the concept) from the terminology repository. - -Deletes are acknowledged with a `204 No Content` response on success. Deletion can be verified by trying to retrieve concept information from the same resource path – a `404 Not Found` should be returned in this case. - -Note that resource branches maintain content in isolation, and so deleting a concept on eg. a task branch will not remove the concept from the code system's working branch, until work on the task branch is approved and merged into mainline. - -#### **Query parameters** - -- `force=true | false` - -Specifies whether deletion of the concept should be allowed, if it has components that were already part of an RF2 release (or code system version). This is indicated by the `released` property on each component. - -The default value is `false`; with the option disabled, attempting to delete a released component results in a `409 Conflict` response: - -```json -DELETE /snomedct/SNOMEDCT/2021-01-31/concepts/138875005 -{ - "status": 409, - "code": 0, - "message": "'concept' '138875005' cannot be deleted.", - "developerMessage": "'concept' '138875005' cannot be deleted.", - "errorCode": 0, - "statusCode": 409 -} -``` - -{% hint style="warning" %} -Only administrators should set this parameter to `true`. It is advised to delete redundant or erroneous components before they are put in circulation as part of a SNOMED CT RF2 release. In other cases, inactivation should be preferred over removal. -{% endhint %} - -#### **Request headers** - -- `X-Author: {author_id}` - -Changes the author recorded in the commit message from the authenticated user (default) to the specified user. diff --git a/docs/api/snomed/descriptions.md b/docs/api/snomed/descriptions.md deleted file mode 100644 index 40a0d6aafb3..00000000000 --- a/docs/api/snomed/descriptions.md +++ /dev/null @@ -1,3 +0,0 @@ -# SNOMED CT Description API - -Coming soon! \ No newline at end of file diff --git a/docs/api/snomed/export.md b/docs/api/snomed/export.md deleted file mode 100644 index bada0ab0309..00000000000 --- a/docs/api/snomed/export.md +++ /dev/null @@ -1,3 +0,0 @@ -# SNOMED CT RF2 Export API - -Coming soon! \ No newline at end of file diff --git a/docs/api/snomed/images/parents_ancestors.png b/docs/api/snomed/images/parents_ancestors.png deleted file mode 100644 index 08aca2e6b345c08081c048c11fde0adc86df6820..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61897 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%0D+gi*#hBK>ACNzU4ATK zHL#u8(U;_RO&s*{Re8u02|#^bE-WG>;c&O5)+unV8Dmd1#s~Pi+zr)Rg<}O&K5cS~ z4s~Ppuosw=!V{8q_>KJK!)FId!F7_!Y9$d+xDc<~GN?p+Z`J!@Fehts7XBp( z`@`zHTN9=qR4Wt`DN(%ahH09JzNa{)XBz}S zJ|yw|*Udb8?*be5}%2R(1X!5R-mwOiD7t!Wt4cXSN9zbwN zV&#ds)?2&2>4oCceD2-8n8-0a3|*5?Q zeJ6>omYehBVC7YN-(u(Kq?)g>Snhlqf8t5t4Y7klw7`7)vHbCev#d|^gCNU7S;b$i z&TMV91@``iMV^~)r^;f<#Y(l*SF*i8PCEy1WoW6_}r z_RN01SnQov-2+udm~Yt~|={@aek=5=G3Zpy&T0l(w2 z(=k_Dr@dLgzV)Ubho{r3Fe|MPp1#1834^Y=ZRq}K(fsDhX<}T;o<2_i#Hr+UY3F`72rz^hGqpf6;s8=*` z=Znrg4{eJFJA}Zye+7z2>`y1kd2Z*zW29@&F83?e-22r}PhBde1dmu9?EH=!bpNNS zw~mV2i@Uu86e&=kKcu*}#S0X7heFZf?(Xhdtax#EcbCDvSO*x~-Q8i3cltbct@qxn z`D1b>Ig?~EE6G0Jy+8H#LgP84I@zf=0d`YFjqgNZ`r1 zIF#&c>iO5L4w=nVon$^VyF#VQFCMz2)0$*|<=$z}tYSGsLq-CdbYSruCCslW98?`c zzUoh^nU;x$Wy;xClXF3_CfN*9_K!G_0<%@>AZ@;ee66D*lkdr=vv$*|1sQq2cg^l@ zjwZg=IWL&nfNTXFs}zo>_s)D8tiS($f^t@wFVv_y%j`@l=?%}mrLce?cg6d$xt<+< zZnS!XEWxOKW97RE)&rMoH5wk&vBX4q3yfCcFxV)AsUhG0OUojeYqZ)!f8KRSCfFkN zYmqT_f1ahfgv2qC9T;dU|dp;-3muKZG4Bcm(i z%t9^isea-`$~K5Vsz7<(oj8KOoH<~+-eltXrFw(e+{rnJ+QTl$t9mc-|FO7@>B>-Lu=)vV&@ zuz#O~9Hw<+7!L%f|B=hPyr07ob9d~Kx>maR=fvThn!|e{sPG`5&kn9q@OZLfW)MSu z^GiDL--<}v1>~Xr9|J?4UXEyNnf>EY124hp$j%+;Fj4D?ItR+H2-CV|{<(WZT7AyH zB###8@#HDcB(&j<)_s(!Td;lcmMSupjwGF7O+mb@*x4}ZqzQ9#8q@sg8ejFyq%*vc|Y#KJ#`E)s(R$u*x2#0 zb%=rQ>+>C%s_o_7Q=PMN#vgAR>#B@+j@rY zb&_lc(^}Rph;Nt)s&$bm1db-_a?DjNG2-S}MJy5ygr>bm25?B^52WWyyz2;k_quQ09EbI0 z+N3i@>H)Fa{XWGXg;8lqDoW*6?9)R`OVUhIf>;O?r*J=%^8{1IN4$}X2gD#Aia6og z-(l1cNDp&RH<;p+PMd0(48h9Q*Y0HrrvyOXJv8c<{1^if?x|y2O7FlP{dt$i4CNUd zUd_UpHCLa0H zQ+ng+xk4xuQTW<@xo8*;|3~%eUTNtDpAmlZT*K!Knr@z%nuF0{wJs_=gBFqS)IDyg zIOQ0_7e+|dhPnifNuPoYBrp3YXS-|ABVE?`!tW&0%^6o5I+VTO>UOufT@)I`_MZrO zf)Ex;$DIE)B@OD7m*N{S1{`rAWt_r4Xm~gS6F3Su@Jt;ct0E#I|NS@RbTs?$><}M2 z!BG9_B?HXOP0jmna@*wv^YOBJ8P1;WH@98Qf6k}dBc}3vjuA^T!NiPdX=%Y@)NB!v z%j9`jC<=Nif9;4b5Mx6XI~@>jGE^z{8RO9(Ih-I-m8es6{>7A%4$*ZH3Jra*d=DHi zx0{`}KlIo}=55CHURUZ>kxbjoKk(ABM;S`hk^ry^?*0$no0y6Td?OhIpwo+&1i+f5 zug1(lN4gz4`K9C8T)%M2+2Nv!g6cyw#XuEGK)>0<`_f)eXsj z0EXUpA-90A$wJtYt!o*ynr%Bcb*rt$!Tp?f8Q-6dr9lRIsug4Vc9`wq>`#;Ot8b|X z2wyhG;8<#HyqsR5YA$J(QsBd5ER=`puWM8xyP3ODQp||WgNUK%=3w<3S2CPjh{+XOmS;@N#1Uh zYHw-McHZ4VH-(f);v#86_FAPkK!>q7Y3%lFF4sXyec5Ck zq;u%&#!c%NDpcDHE9R;*pU*KD^qEzyMHyH2x|GM0bPF~sog70ljs3_HfW=?d5=#&Gf z?Exbltz}jbma77cOSb}UN_*(=X8IdrRTAG_;R={MLGoB?Mt|C03nmqXlHyD8rmc<}PCUdh4vmJ9CK^Z@ zNMcS|aDjR*e*UK+<)lg3@6F!mZJ!k*KVHciQF-@SQV6NL3b@`PBBArB>O8;smn0W2 zi~~p4O2gb|Pb})wXlc;v7f&=an_siFo$*0Sklp68=1XK%IS&fFp5uv77fS?TlMTW4 zMpBmNhAGG00%!S(_@r$!3xhn>y?xJEA7^D0(X>O-cE|JktAo&=0lQ@8BeAKDMqn`V zacjskGDZfU>v**-0+Sx+?;=dU4$B@h=w=!lOYPKhD&$dKhp$XcDHbP$#`k&o0-gSDr-_MG$(ESkjpo4m@fSAo)ek!k^F0F6ZSg|`TozJ|qo|mqj`PW) z;CwGR!o92}bHmq~kR)108UGs$H;eXegZr*TF~`!HYb3xiH}a6ImY{$j z<9#Y;(cH@ORP1>LS364rA{YM7+^r{g7_Hb97U%{5k|d4jhf+d3au2<(E8rwPlo?ME`!a)^J~p zV{jC*Q&s4V4}B8(FP)ilARa zbGrV^^6qe&f9mV<^X!EUFVmKdUNw_^zd`dk5Vh!RK3((|Q!kt7VHyhnD!$7tbjMrF zslcml1M9^R!6f`}K<|`5`sJjWl4j%&W_CB5O<3?leOdVi#I5h~6i{INqXd?Rl53>n z3&XWv-lAR~jGz%E&vezTXCCnj^z%{!KsV9uH?{}Cxu)nacrr4)aB!9Mz!r=pF@AV= zWV3>SMFKIH=Ouxw;~eLOjkugU?J$m%s^-o`i&ekshLWhIcy!9&nPp^=l7P^cU;8*$ z+t;1B{PW%+Rqfv{{DSDRULnqmv&Wx)oZB^Td$QuM1QkItezPFs;!V7u=Dj2KPe@EH zEh{_f6N%~3Ot{@FN0T9!LX}96qe!}Y+tKd#4*0`^ce?P31S_s}nH+Iy2D%NJ5%S&$ zrwE#jEYD;ME_lNM?XMff)!sE!d??;C%v$Yl|)P#7AD)gO;PF!*p$=A#0U+)v>=+TErvsey0zRUpnkbskE z64!@7UJH-e?!y4DIEp<>Bq1CeGg{le^LyslPwVJC5pYQR068u$5#RU^DFJ_?7Rx1{ ztN1Y8*Ci|JebUa{Os|GDKZ?u|{xvG!bxy5LR2DQKHru;F4ZJasAv|^eBAQ+GDe%iP z5+~tcnkDm^*l*rj_dJ1{qQPcg)fC%y_Of`OE&me`Z|;31-=!H`%WbO@Qp%KUbE3o$aYOlF2frMcuWs&>Tz=l_vgCGozroDD>G5UYc}{)rylO6Uj6 zepPGw-_DKRCgmJB^GT(q4}_F0j!cv)DHuQ<3>6Tq+3A{C?nybpWT*9l;a2=7+B^w< zAO9E$RzIvS)dPSkCNhLuz4R~?EcQ-33xfcaLJc3-xxKnrO5W3M>C`)I7V={M$dl={ zQ%WJ~cD7ov%C*esTVU4Jdd0{+|h+x0jDwvZ~;Jk+gqS!)0sxaY=wUEsB5Nk5Y)GU^X8=k+?n~c z;x0O0%_nuc^Fsa*(X9tkp;3u2)c)_#O|Z8qJ??;_X)3HNh3lO6%Bpy1(>PbgEjO}{ z^!oN~i|p2DhQYPct(?w!m}0EzUfY@~1QSU2EOwm2Q2`1#Gb`ih0D~;A^fB&CiUgqVx7|=U(gUi3 zs-R_Ycs%{=L>EuOQ8D87J^yp@Q!<)q1k`E&a=ddp0jsXBVTg6vQ<)R}f7L2|aPWZIl`*~fl6cy))w%!?rx*7qyBs7-#9`uDJUD(< z<(@0bRZiV?x4awh>+KeyDsm3}>_@RgLin&=RDXvJ;2ylR5kFfQjoIS5aXg`M)o#8} z1S3$V@87I3Ex3k?;so7w%~xR_TqykrnOu=ZYfp$*={mXkZW;sMjUn~ul9)M3vT%!* zUeNHS^dk{76Q!#$6;E9y@*7M0((NY))wcHhKcf&Fb*-6cy~~+|bP_gTd(YH;HmuZH z8q(br)n(G~hCIA|dB zIGVD&&;T(6qhxlVA71^-$3T5gu`K80O#~zz2x7is6K>H8Eh?sc^8zt0Ap?03mPq)q zvT-EVB}zr3wN7t%X`jG~lYx8lV~&w>6EfMtMrrt44xl^e3(OX$-yJh2ct#AQXp+ei<2|YiA+|t$0f^wD1=h!*ar_+Y10f_QkX3 zN-+RSTaNBbcz{&|h|PQpXnfgllkP_Pvd|cEB53NIj0p!!qmz+#xRh!U}y| zB}xNAosItByR^|@wI+24Q+C3A7~G@kkQlEYQ-% zRcxhjpMgY3kR_e*TiIS0oB8}h45mkn5BAfb&3%fWiYvlyvY)CL821WW;gDp1uz!9r ziHz?6jD_OhC++kj)!<6#@@U7ulzQGxqMewi$zB5sios%W^K&ZV^(U^OG^phqe*6ae z5M}o^OguTHiDQnv>b2#tB8t`&=(a!Yvg*?K_KS_^wx`)EO1U*s&E&Eo^;$aZ-u;9euFHxL`r~$^tM@S5p4O$t zn|5;TIX`c^)M04a!7XOpwomuWbKTQiaAzbk@zU z0T^w@`u)jCK3o=y<*C$Z;^M*Ps-uOYr9X8uI*lK$6hO%9{5`I8>kIZm3acZCXMX>k z7D0!c_i>0=EdORKU>C;_x^+rvi!$Y#H{fV6r~KS(YlgFrqq}eZ3DlI~B`?zf=l1i*gsxHX zfRGDMg0$6$GznRWb=wHC-tc~zp^|YVJxCf$M4#TrE(Qx;wsvXzQZxu)Td;^9u~YVx zogoPLeTJ)Ciu(N*JZ2d@`q7W`HRnc}a2U(a!({b{BfY?A#Uj}}q)d@2&>%Hoy5U+& z1IMV}^ChlXmuS8^W<~dqtLQ!c8zkA$Eav%Z11BoL&HU`Nf)Y6xmc$Yuk|h9F8%6lw zp28;X`Yn9ec=_?-@N{eNt6X{{ts)k19Z?*uBRl*iB&vj9r9_w!IJW0vMnYhkz@hs) z&gXdSUMqWZS$*4&?VxL$G1?VLqX{#1_IV!m|BB4u3;%G$X^ls)*>)t@<`ubb+q^(` zr}7O4vGk*t-sa>}UL1%K#1?)&5GD+yma4%XTN}BICyh}tDsgqF1M_KzRh?g+f-8=# zr3Tvd!z)xcdFXHe-eU}1922dVfPSin;7`K8Ss2r2^1FxaXp*LI`PRS&)bZb5NaKTX zqY%9$)Q&n&{~K&1cCBmv9{k?@;0`rRSB+($vsmH2*_LF;L0isMu6H&lApxgt<@0EG zTboxX2FddBax|Hs>*KXl$VQo3^~*Ixp3@Qsiqe5+lIm+OsG_2xtm4AB4fAOhS?EBN z#T^JZ*kp-XE;~qS7>3ha&#)Q8^3+32Mn1!rg~N#2x&{%LX)u!*Bhg?PAv{oF1$yjm zB1KU|AFV@w2jG{-73}jAnWycbI|m!an@B-eWYt#j@vP!1%&ROuh8eJwsTb^ zu}*^o^IAfBZ<^SH1gv4tw5E%vv^X% zh!jk-;XcNse<$wK|5Lw$zOEu+=T}8?DW!QhM9x%8055Ou)o;Rugkt;0;Uz6NJg;R; zJv>i4pepl(wDi|&6Gq$^CXBrM`H3GdyvQQ0=qZ|=0tFofi2d^n-9|$IHnHNu9I^i? zQgAi;2+}Gyy?$$2r0DBImhEs_ux8k+>}%nXy!B&RHltN1ZGhk2>N7gLAS$X$-Fprg z`Zo744*_Pw4Q-KxPQ5x-N;6HoE>_oJqjXJzD6byEd>ENg)Pd`2H{=q0tM!R6L+mm< zV*#?<3OZn31)UB{4G2&epn!({gYf<@4&w>jB2fMgh_repqJ0k^AXJiP$}Zk2uoW7n zj*arBS5UM?>iz$}G;G&kGkJ3`-p2odc>JH4>$HDBj{l|go|ltD`QOt8xbR=B|7I`H`o&xw^42 zqc9e2P@EEL#lV23B3upLN+3-Z007F@d%nP8FReS#t9RH8QDAL%K{eKwpDFMYUw={e;bZF;uP^PSd=A2#Rl)# z;MmQux6Kp@d^Rz2n5|VZQ?gx^k&~0_bf98q+{&G7s@7Al)&Tn*n^EoboTRlk*)G|2 zSle$&L}|Ig;v-M>Js__VzXD>FG4# zH-|I%7Cfw1w_s?DF3A31&|sP?4#Sd0VWy6D{4dWZ#3P2NfPtJq*7RC)(s}wP7TVXR z8D9P&#=8sV4+|%tXvCgr@+J*vw9bc)uN{UBBx@(_&YS%gZI)B`D#_j?_$gg%5&f1_gO} zyl!W7BUEnt%dc0fpmCo2)P2EiSF_u*>!^eOj!np;qG6}R-PXp&WPud++$*RG5iyjE zFE%UzM{<~vm&&Yg^r7wy+aQ=UFd+`CH>^+W$|!bT`hIbizhc2C?&jhajzWL;i93t0 z^00+QaPLp&*_x-(->Qz#*YuVFWsZh)0T&Kj-<@po+4HN*56G2Vl_nXqWJzh>R!r%f z9TLTRzE(f-Xu>6an~;^xA!Ts__~_T!cU(xT-9+NE=jVKXEQ%im3A%RGXZ;@q{QjJ1 zy18F&^%s~e4#wh1!mw{cLW<6JwwY~iN7h|FpN}R6t&*9DJCvS<>TW&H>K)ioF^I2p zW7oG%_Fy#O70`(nz7?B?wx&8FvP`zXLzXc6YZQC6d=_YZYfn$R$>Ra7s>ag>T4l3z zN2bW7_hetF+ZS^8fMxc@eb4PJ@v^2-Dc-= z<8{A=48eJ3+=K#f^L8JkabeFrpgQ?B&m}?cS5?K*Gq0Dc6)cfdllRWwReO_(Jl%d_ z;}cR;iSNDqk{ZTUYVkeX%Q{K>$~Nwpk>0j2I*LXyZQ5-P__zH+$<34^i01tOb%``G z-`>UMGaI%nbR4wRgco4TOGg4^sFB&lU1=V5&3239j}SX>Y1U0Gj>1_BMzsu)GZK^pc%bp?0Wm&{h5 z7;4_eRUhy1-Ts2)M?N@!!XOtIbfk~2(>@k-7CZWT0gfgBD;)+P2)f#??6y%Ax6Q)9 za9YKkwm5gnHz~XEpJivAhk_we51*uCbomMU8xeu?OJvRYn)`uPDQb~J_EawJFE>-e zpX!Hpq|8sASgNk?Y`wkKTas4-k1)wNCxOF_4lm6?4((>AH76ZHIHAFV%G#4hc3X(a zWr0-Oal5@SxE+_sOr9(*%ez#4cKnnQ<+QKuhGDp4ORb&+V9t{ddfyu;GLmgOd*zc< zwYFLydq=C}HGfs_O4g!m9p4?{m7`Ci@t5Fvj6A=2jWvHz3+-!jm9FzPELWGhQxuc4 z*^aYxWn22~A+LE#vU!WoRc{!a&h20INAU&bfmE+tqpPaDy2Jp4?Axn#I~`fiCV42r z)v8vremH&aMkXv^Le`}kkK1+XqonTNbAe1g74hx)P=fi(9;%@-$)H_aoaQ6;esEa* zWr?K#DWDMdq|^agS*9|Ql+8k~b9z0kCYoF8Jae{$=%aSemOCwFSK+ zEh_1*-;*o9eg6(Cx{UVg!0M(d6aq0ljdaTMtwiSI`5y3S*XuL*@0Vav@aE?{z2=oe z+b!5^E~u;eSR4#Gf6GFw3(fqVF8TfPp%h*k)_W#D+w5evB%n-tiN#oJT-}wr@^i1Z z*YuS}`BpQfiFwOyqT0^tjbR)Ebc6VIDNCzZ(=|CFrr~EMYm*%(*zdMN)qDvntKNr< zX&mryJwAsJ&iHJCWbOxg4`2lk#`!6n0{3Nn+Z}U*t*u_|trxLJ_7L7JZhw+e(2>1) zInt`|`|L9T71Gxmsh=M4b0Pf0RecNcL+L9i?1F_!lI~`fdO%Dc?L$?caHZkX&p^yo z26_fb&84K;#v?ZM=ACX)r~8w`ht+_MV#Y-HB^Ay&TS7ZV-Uc&0b7I{2iY@y{ht+|; z4S}LbyNWL{+Hr}xFR!~A&repfydGCyEaYF&3X-Xw@_xw#aDV&+es-*5sqBX6>pRw+ zsaJOSWu=yFQz6ZG=F>&q)9>9qM3 z8F@O}>fkZ4?%UViUF&vd3d1$?xZi+8EqOpj>K;MAs=r(Z*n7l?eyLCR>blC|LbQYjo18!xMM0(_j%n>61D%`rK&* z2;q|6E#``T=7c0i6z8H^FFMfh(?j!c{W0{Iw+hn)92r@|ZC8zkz>;Jc88Po4K%D=M z&h{66X12)9$Y5877N@X{Dcim651PJifkPOXYAW2Hn_fhNXqjB>vsWeKuI9Ym>im{K zNW%83t@8~IXz!92{m}$<>dSXxFXH$31#=?U1-BAYmF8<^?cPN&$_p#uHXjOL{=wM! z&s$chrmUV)Z($m7BKH`h<~kx1X1}nO{dT{&WC%;OnmNl_8N%O9o{ADo< z>l)Rrr_Pyeo}2OegoLVr<7OpK`<=r%l8;% zi^s5)stKGG&|S?Z5-o0P)kt9on@&7hrK1ZRkOQg5*2E;fUCZ`Uhi;6lW@@roPabr< zT3acNej|K8Y1Nw@5$Dx$eyA&XYchrkid<6K<8@QC;!KLDN0mEizTeJ9x-HSpq^Qgzjr7`BKH$aBioaFLKDZ5{@873L+SX7=^*JG$;Wl{QbbTK5x$U6@ zJg3S>*F0=2O+-no!fzFn-UHs=qKJ0Y^+&F~-JqSlA56xRY|$8gvl#aU4qU54UuU_(UC3~9i068baWwV zwydmUr#GE=7jeU+z)88dcI?J^aH&@HR$rdvU@KbbFee5{ha%~9-$rID z&xg4@*od5aW6AsBL#SKf@=!logBnxH!?MgoqRNnWDzx1NBH078Y;_`FnYy5&@Y!6`vXN5M& zCM}Oi>dyW8`QlB!m6sR3PIG~IND=)wYB2$(X7c~WD8sFNjAI~ncpS7cPz6%v=1rb;4*QYo?-e+*CHI))M zvqCs5o*)2@EP_s&&;IT9M9Pfb>C5hp0qLg|t!dRyqq{D8(OzywXGNG_mW$Ox9v**k z)>mcODpS{eyc(D1BS}dpoGPc;w;}*;kSSfd1-^8s}<4m{J6BMxPK_&^6JFP(e5Pj84k8F;05& zC`UNcb#FWP^0OG9#EQ^#Ka|L31|hI9uD6gW8dA*XcCwwSOEnne{)@L$OQUP0#I;f@ zitM7Hn%AybOaAjI&GkWQjpaz{8D~uPtK8hnb6?p*Z9}KsUQ$1{8a1OFP2$<#%8GJd zU$YBJK8O8>{2>r#wl;O_y_BzH+ea)?p#k^7f(x*~)pYwqz1iOkK7-zpo}bXW{mE7} z?-)3Q5OgAre5tJ_CUDmCy%|M(DkmcXyIOahvBPKwsflPJ z*<`g1;-f5@DLTVU%9dV)Iw*e=YMs9Gv%Q?D@M2vg=2m-jVaUvV|3MJWs6w+IE=TU{ z*N#I$VB}8qIL(?P6&FY+w&1AldtFwPA2hvKihV7ujh< z6qU6KjL+VUo9cv_0ln31Q>7h0-oC1*e#gk(zg*S<^3Ig4#-T9S8qs${g5_)6fbVpg zvep2gKH2x8M9=<#eoLpc);3qlqP41fyFN7Ju8k9=1X6Nyi(QIuRQb_rZ2ij)l71A@ zxZr9_zMr&8b=420s&TGNXTlKf7u*PY)H0tDPAjm^7}RD#3- z_o67TJXqcF9iG$GYD2coN1$ky=;&w+6cktvxaCw!Ri3#-J}nGd$@F)I*D1+irdLl_ z-NLIY3+$%0djE#T(Di==n#%scL4lG#Jv}|+Y3$IpI^$dRg@{X6-&P~{YL2>!L;UZb zxUclQ$1NJgW-a7=zxKZRiH86CZv5%qB*n&PvjzSYSq53F@E?Y>&eEG+>0Oy$!@QFs zg7yc8`=4iia4G_vMM_wn(0#dHyNf|igb@c#oUo)a_x diff --git a/docs/api/snomed/import.md b/docs/api/snomed/import.md deleted file mode 100644 index b591726da76..00000000000 --- a/docs/api/snomed/import.md +++ /dev/null @@ -1,3 +0,0 @@ -# SNOMED CT RF2 Import API - -Coming soon! \ No newline at end of file diff --git a/docs/api/snomed/index.md b/docs/api/snomed/index.md deleted file mode 100644 index 4b658081a26..00000000000 --- a/docs/api/snomed/index.md +++ /dev/null @@ -1,26 +0,0 @@ -# SNOMED CT REST API - -This describes the resources that make up the official Snow Owl® SNOMED CT Terminology API. - -{% hint style="info" %} -Swagger documentation available on your Snow Owl instance at [/snowowl/snomedct](http://localhost:8080/snowowl/snomedct). -{% endhint %} - -## Current Version - -SNOMED CT API endpoints currently have version **v3**. You have to explicitly set the version of the API via path parameter. For example: - - GET /snomedct/branches - -## Available resources and services - -* [Branching](./branching.md) -* [Compare](./compare.md) -* [Commits](./commits.md) -* [Concepts](./concepts.md) -* [Descriptions](./descriptions.md) -* [Relationships](./relationships.md) -* [RefSets](./refsets.md) -* [Classification](./classifications.md) -* [Import](./imports.md) -* [Export](./emports.md) \ No newline at end of file diff --git a/docs/api/snomed/members.md b/docs/api/snomed/members.md deleted file mode 100644 index 14eb44a4cfb..00000000000 --- a/docs/api/snomed/members.md +++ /dev/null @@ -1,3 +0,0 @@ -# SNOMED CT Reference Set Member API - -Coming soon! \ No newline at end of file diff --git a/docs/api/snomed/refsets.md b/docs/api/snomed/refsets.md deleted file mode 100644 index ccd43f1cbf2..00000000000 --- a/docs/api/snomed/refsets.md +++ /dev/null @@ -1,51 +0,0 @@ -# Reference Sets API - -Two categories make up Snow Owl's Reference Set API: - -1. **Reference Sets** category to get, search, create and modify reference sets -2. **Reference Set Members** category to get, search, create and modify reference set members - -Basic operations like create, update, delete are supported for both category. - -## Actions API - -On top of the basic operations, reference sets and members support actions. Actions have an _action_ property to specify which action to execute, the rest of the JSON properties will be used as body for the Action. - -Supported reference set actions are: - -1. **sync** - synchronize all members of a query type reference set by executing their query and comparing the results with the current members of their referenced target reference set - -Supported reference set member actions are: - -1. **create** - create a reference set member (uses the same body as POST /members) -2. **update** - update a reference set member (uses the same body as PUT /members) -3. **delete** - delete a reference set member -4. **sync** - synchronize a single member by executing the query and comparing the results with the current members of the referenced target reference set - -For example the following will sync a query type reference set member's referenced component with the result of the reevaluated member's ESCG query - - POST /members/:id/actions - { - "commitComment": "Sync member's target reference set", - "action": "sync" - } - -## Bulk API - -Members list of a single reference set can be modified by using the following bulk-like update endpoint: - - PUT /:path/refsets/:id/members - -Input - - { - "commitComment": "Updating members of my simple type reference set", - "requests": [ - { - "action": "create|update|delete|sync", - "action-specific-props": ... - } - ] - } - -The request body should contain the commitComment property and a request array. The request array must contain actions (see Actions API) that are enabled for the given set of reference set members. Member create actions can omit the _referenceSetId_ parameter, those will use the one defined as path parameter in the URL. For example by using this endpoint you can create, update and delete members of a reference set at once in one single commit. \ No newline at end of file diff --git a/docs/api/snomed/relationships.md b/docs/api/snomed/relationships.md deleted file mode 100644 index 83b8f65134c..00000000000 --- a/docs/api/snomed/relationships.md +++ /dev/null @@ -1,3 +0,0 @@ -# SNOMED CT Relationship API - -Coming soon! \ No newline at end of file diff --git a/docs/api/snomed/validation.md b/docs/api/snomed/validation.md deleted file mode 100644 index eaf308dbadd..00000000000 --- a/docs/api/snomed/validation.md +++ /dev/null @@ -1,3 +0,0 @@ -# SNOMED CT Validation API - -Coming soon! \ No newline at end of file diff --git a/docs/backup/curator.md b/docs/backup/curator.md deleted file mode 100644 index f29dc9a3453..00000000000 --- a/docs/backup/curator.md +++ /dev/null @@ -1,166 +0,0 @@ -# Backup and Restore with Curator - -## Prerequisites - -Please refer to the official Curator [install guide](https://www.elastic.co/guide/en/elasticsearch/client/curator/5.8/installation.html) on how to install it on various operating systems. - -## Configure Snapshot repository - -In order to create backups for Snow Owl, you need a repository in your Elasticsearch cluster. - -To create a repository (assuming shared file system repository, `fs`), execute the following command: - -``` -$ curl -XPUT localhost:9200/_snapshot/snowowl-snapshots -d -{ - "type": "fs", - "settings": { - "location": "/path/to/shared/mount", - "compress": true - } -} -``` - -Elasticsearch requires that the specified `/path/to/shared/mount` is whitelisted in the `path.repo` configuration setting in the `elasticsearch.yml` configuration file. See section -[Shared file system repository](https://www.elastic.co/guide/en/elasticsearch/reference/7.7/snapshots-register-repository.html#snapshots-filesystem-repository) of -the Elasticsearch reference for details. - -## Curator configuration file - -Curator requires a single configuration file to be specified when running it. -If you are using a default Elasticsearch cluster with default configurations then the default Curator recommended file should be sufficient. -Any configuration changes you have made to your Elasticsearch cluster needs to be changed here as well in this config file so Curator can access your cluster without any issues. - -Example `curator.yml`: - -```yml -client: - hosts: - - 127.0.0.1 - port: 9200 - url_prefix: - use_ssl: False - certificate: - client_cert: - client_key: - ssl_no_validate: False - http_auth: - timeout: 30 - master_only: False - -logging: - loglevel: INFO - logfile: - logformat: default - blacklist: ['elasticsearch', 'urllib3'] -``` - -## Snapshot Action - -Curator is using action YML files to perform a set of actions sequentially. -See the available steps here: -https://www.elastic.co/guide/en/elasticsearch/client/curator/5.8/actions.html - -A Snapshot Action that can be used to backup the content from a Snow Owl Terminology Server. - -Example `snowowl_snapshot.yml` file: - -```yml -actions: - 1: - action: snapshot - description: >- - Snapshot all indices. Wait for the snapshot to complete. Do not skip - the repository filesystem access check. - options: - repository: snowowl-snapshots - name: - ignore_unavailable: False - include_global_state: True - partial: False - wait_for_completion: True - skip_repo_fs_check: False - disable_action: False - filters: - - filtertype: none - 2: - action: delete_snapshots - description: >- - Keep 10 most recent snapshots in the selected repository - (based on creation_date), for 'curator-' prefixed snapshots. Ordering - is age-based and reversed by default for the 'count' filter. - options: - repository: snowowl-snapshots - disable_action: False - ignore_empty_list: True - filters: - - filtertype: pattern - kind: prefix - value: curator- - exclude: - - filtertype: count - count: 10 - use_age: True - source: creation_date -``` - -To execute a Snapshot action manually, you can use the following command: - -``` -$ curator --config curator.yml snowowl_snapshot.yml -``` - -## Restore Action - -A Restore Action that can be used to restore the latest snapshot (aka backup) to the Snow Owl Terminology Server. - -Example `snowowl_restore.yml` file: - -```yml -actions: - 1: - action: restore - description: >- - Restore all indices in the most recent curator-* snapshot with state SUCCESS. Wait - for the restore to complete before continuing. Do not skip the repository - filesystem access check. - options: - repository: snowowl-snapshots - # If name is blank, the most recent snapshot by age will be selected - name: - # If indices is blank, all indices in the snapshot will be restored - indices: - include_aliases: False - ignore_unavailable: False - include_global_state: False - partial: False - rename_pattern: - rename_replacement: - extra_settings: - wait_for_completion: True - skip_repo_fs_check: False - disable_action: False - filters: - - filtertype: pattern - kind: prefix - value: curator- - - filtertype: state - state: SUCCESS -``` - -To execute a Restore action manually, you can use the following command: - -``` -$ curator --config curator.yml snowowl_restore.yml -``` - -## Taking scheduled backups - -To schedule automated backups, you can use [Cron](https://en.wikipedia.org/wiki/Cron) on Unix-style operating systems to automate the job. -The back up interval depends on your use case and how you are accessing the data. If you have a write-heavy scenario, we recommend a hourly backup interval, otherwise some value between hourly - daily is preferable. - -An example crontab entry that initiates a daily backup at 03:00, and captures Curator's output to `/var/log/backup.log` (both standard output and standard error) would look like this: - -``` -0 3 * * * /path/to/curator --config /path/to/snowowl/configs/curator.yml /path/to/snowowl/configs/curator/snowowl_snapshot.yml > /var/log/backup.log 2>&1 -``` diff --git a/docs/backup/index.md b/docs/backup/index.md deleted file mode 100644 index ba3dfafb72a..00000000000 --- a/docs/backup/index.md +++ /dev/null @@ -1,13 +0,0 @@ -# Backup and Restore - -Snow Owl uses a single data source, an Elasticsearch cluster (either embedded or external). -To backup and restore the data, we highly recommend the official [Snapshot and Restore](https://www.elastic.co/guide/en/elasticsearch/reference/7.15/snapshot-restore.html) feature from Elasticsearch. -On top of that API, we highly recommend using tools, like Curator to ease the lifecycle management of your Elasticsearch cluster and your indices. -See Curator [here](https://www.elastic.co/guide/en/elasticsearch/client/curator/5.8/index.html). - -{% hint style="info" %} -Reminder: for production environment we highly recommend using an external Elasticsearch cluster as opposed to the embedded one. -External Elasticsearch clusters are more customizable and can be configured to use other snapshot repository types, like Amazon S3, HDFS, etc. -{% endhint %} - -Below you can find a very simple guide on how to configure the backup and restore process for your Snow Owl Terminology Server using Curator. \ No newline at end of file diff --git a/docs/getting_started/basic-concepts.md b/docs/getting_started/basic-concepts.md deleted file mode 100644 index 2ceb57d8427..00000000000 --- a/docs/getting_started/basic-concepts.md +++ /dev/null @@ -1,42 +0,0 @@ -# Basic Concepts - -There are a few concepts that are core to Snow Owl. Understanding these concepts from the outset will tremendously help ease the learning process. - -## Terminology / Code System - -A terminology (also known as code system, classification and/or ontology) defines and encapsulates a set of terminology components (eg. set of codes with their meanings) and versions. A terminology is identified by a unique name and stored in a repository. Multiple code systems can exist in a single repository besides each other as long as their name is unique. - -## Terminology Component - -A terminology component is a basic element in a code system with actual clinical meaning or use. For example in SNOMED CT, the Concept, Description, Relationship and Reference Set Member are terminology components. - -## Version - -A version that refers to an important snapshot in time, consistent across many terminology components, also known as tag or label. It is often created when the state of the terminology is deemed to be ready to be published and distributed to downstream customers or for internal use. A version is identified by its version ID (or version tag) within a given code system. - -## Repository - -A repository manages changes to a set of data over time in the form of revisions. Conceptually very similar to a source code repository (like a Git repository), but information stored in the repository must conform to a predefined schema (eg. SNOMED CT Concepts RF2 schema) as opposed to storing it in pure binary or textual format. This way a repository can support various full-text search functionalities, semantical queries and evaluations on the stored, revision-controlled terminology data. - -A repository is identified by a name and this name is used to refer to the repository when performing create, read, update, delete and other operations against the revisions in it. Repositories organize revisions into branches and commits. - -## Revision - -A revision is the basic unit of information stored in a repository about a terminology component or artifact. It contains two types of information: - -* one is the actual data that you care about, for example a single code from a code system with its meaining and properties. -* the other is revision control information (aka revision metadata). Each revision is identified by a random Universally Unique IDentifier (UUID) that is assigned when performing a commit in the repository. Also, during a commit each revision is associated with a branch and timestamp. Revisions can be compared, restored, and merged. - -## Branch - -A set of components under version control may be branched or forked at a point in time so that, from that time forward, two copies of those components may develop at different speeds or in different ways independently of each other. At later point in time the changes made on one of these branches can be merged into the other. - -Branches are organized into hierarchies like directories in file systems. A child branch has access to all of the information that is stored on its parent branch up until its baseTimestamp, which is the time the branch was created. Each repository has a predefined root branch, called `MAIN`. - -## Commit - -A commit represents a set of changes made against a branch in a repository. After a successful commit, the changes made by the commit are immediately available and searchable on the given branch. - -## Merge / Rebase - -A merge/rebase is an operation in which two sets of changes are applied to set of components. A merge/rebase always happens between two branches, denoting one as the source and the other as the target of the operation. diff --git a/docs/getting_started/check-status.md b/docs/getting_started/check-status.md deleted file mode 100644 index 9f9e600c95f..00000000000 --- a/docs/getting_started/check-status.md +++ /dev/null @@ -1,42 +0,0 @@ -# Check Health - -Let’s start with a basic health check, which we can use to see how our instance is doing. We’ll be using `curl` to do this but you can use any tool that allows you to make HTTP/REST calls. Let’s assume that we are still on the same node where we started Snow Owl on and open another command shell window. - -We will be using Snow Owl's [Core API](../api/admin/index.md) to check its status. You can run the following command by clicking the "Copy" link on the right side and pasting it into a terminal. - -```bash -curl http://localhost:8080/snowowl/info?pretty -``` - -And the response: - -```json -{ - "version": "", - "description": "You Know, for Terminologies", - "repositories": { - "items": [ { - "id" : "snomed", - "health" : "GREEN", - "diagnosis" : "", - "indices" : [ { - "index" : "snomed-relationship", - "status" : "GREEN" - }, { - "index" : "snomed-commit", - "status" : "GREEN" - }, ... - } ] - } -} -``` - -We can see the installed version along with available repositories, their overall health (eg. `"snomed"` with health `"GREEN"`), associated indices and status (eg. `"snomed-relationship"` with status `"GREEN"`). - -Repository indices store content for any number of code systems that share the same data structure and API, in the case of `"snomed"` the International Edition of SNOMED CT and its extensions. - -Whenever we ask for repository status, we either get `GREEN`, `YELLOW`, or `RED` and an optional `diagnosis` message. - -* `GREEN` - everything is good (repository is fully functional) -* `YELLOW` - some data or functionality is not available, or diagnostic operation is in progress (repository is partially functional) -* `RED` - diagnostic operation required in order to continue (repository is not functional) diff --git a/docs/getting_started/codesystems.md b/docs/getting_started/codesystems.md deleted file mode 100644 index fa132cf5cd7..00000000000 --- a/docs/getting_started/codesystems.md +++ /dev/null @@ -1,105 +0,0 @@ -# List available Code Systems - -Now let's take a peek at our code systems: - -```bash -curl http://localhost:8080/snowowl/codesystems?pretty -``` - -The response: - -```json -{ - "items" : [ ], - "limit" : 0, - "total" : 0 -} -``` - -...it sure looks empty! This is expected, as Snow Owl does not contain any predefined code system metadata out of the box. We can create the first code system with the following request: - -```bash -curl -X POST \ --H "Content-type: application/json" \ -http://localhost:8080/snowowl/codesystems \ --d '{ - "id": "SNOMEDCT", - "url": "http://snomed.info/sct/900000000000207008", - "title": "SNOMED CT International Edition", - "language": "en", - "description": "SNOMED CT International Edition", - "status": "active", - "copyright": "(C) 2022 International Health Terminology Standards Development Organisation 2002-2022. All rights reserved.", - "owner": "snowowl", - "contact": "https://snomed.org", - "oid": "2.16.840.1.113883.6.96", - "toolingId": "snomed", - "settings": { - "moduleIds": [ - "900000000000207008", - "900000000000012004" - ], - "locales": [ - "en-x-900000000000508004", - "en-x-900000000000509007" - ], - "languages": [ - { - "languageTag": "en", - "languageRefSetIds": [ - "900000000000509007", - "900000000000508004" - ] - }, - { - "languageTag": "en-us", - "languageRefSetIds": [ - "900000000000509007" - ] - }, - { - "languageTag": "en-gb", - "languageRefSetIds": [ - "900000000000508004" - ] - } - ], - "publisher": "SNOMED International", - "namespace": "373872000", - "maintainerType": "SNOMED_INTERNATIONAL" - } -}' -``` - -{% hint style="info" %} -Use of SNOMED CT is subject to additional conditions not listed here, and the full copyright notice has been shortened for brevity in the request above. Please see [https://www.snomed.org/snomed-ct/get-snomed](https://www.snomed.org/snomed-ct/get-snomed) for details. -{% endhint %} - -The request body includes: - -* The code system identifier `"SNOMEDCT"` -* Various pieces of metadata offering a human-readable title, ownership and contact information, code system status, URL and OID for identification, etc. -* The tooling identifier `"snomed"` that points to the repository that will store content -* Additional code system settings stored as key-value pairs - -If everything goes well, the command will run without any errors (the server returns a "204 No Content" response). We can double-check that code system metadata has been registered correctly with the following request: - -```bash -curl http://localhost:8080/snowowl/codesystems/SNOMEDCT?pretty -``` - -The expected response is: - -```json -{ - "id": "SNOMEDCT", - "url": "http://snomed.info/sct/900000000000207008", - "title": "SNOMED CT International Edition", - "language": "en", - ... - "branchPath": "MAIN/SNOMEDCT", - ... -} -``` - -In addition to the submitted values, you will find that additional administrative properties also appear in the output. One example is `branchPath` which specifies the working branch of the code system within the repository. diff --git a/docs/getting_started/conclusion.md b/docs/getting_started/conclusion.md deleted file mode 100644 index 7436c96f4ee..00000000000 --- a/docs/getting_started/conclusion.md +++ /dev/null @@ -1,3 +0,0 @@ -# Conclusion - -Snow Owl is both a simple and complex product. We’ve so far learned the basics of what it is, how to look inside of it, and how to work with it using some of the available APIs. Hopefully this tutorial has given you a better understanding of what Snow Owl is and more importantly, inspired you to further experiment with the rest of its great features! \ No newline at end of file diff --git a/docs/getting_started/explore.md b/docs/getting_started/explore.md deleted file mode 100644 index 2c90b20f205..00000000000 --- a/docs/getting_started/explore.md +++ /dev/null @@ -1,12 +0,0 @@ -# Explore Snow Owl - -Now that we have our instance up and running, the next step is to understand how to communicate with it. Fortunately, Snow Owl provides very comprehensive and powerful APIs to interact with your instance. - -## REST API - -Among the few things that can be done with the API are as follows: - -* Check your instance health, status, and statistics -* Administer your instance data -* Perform CRUD (Create, Read, Update, and Delete) and search operations against your terminologies -* Execute advanced search operations such as paging, sorting, filtering, scripting, aggregations, and many others \ No newline at end of file diff --git a/docs/getting_started/index.md b/docs/getting_started/index.md deleted file mode 100644 index d63e0df59a6..00000000000 --- a/docs/getting_started/index.md +++ /dev/null @@ -1,11 +0,0 @@ -# Getting Started - -Snow Owl® is a highly scalable, open source terminology server and collaborative authoring platform. It allows you to store, search and author high volumes of terminology artifacts quickly and efficiently. - -Here are a few use-cases that Snow Owl could be used for: - -* You work in the healthcare industry and are interested in using a terminology server for browsing, accessing and distributing components of various terminologies and classifications to third-party consumers. In this case, you can use Snow Owl to load the necessary terminologies and access them via FHIR and proprietary APIs. -* You are responsible for maintaining and publishing new versions of a particular terminology. In this case, you can use Snow Owl to collaboratively access and author the terminology content and at the end of your release schedule publish it with confidence and zero errors. -* You have an Electronic Health Record system and would like to capture, maintain and query clinical information in a structured and standardized manner. Your Snow Owl terminology server can integrate with your EHR server via standard APIs to provide the necessary access for both terminology binding and data processing and analytics. - -In this tutorial, you will be guided through the process of getting Snow Owl up and running, taking a peek inside it, and performing basic operations like importing SNOMED CT RF2 content, searching, and modifying your data. At the end of this tutorial, you should have a good idea of what Snow Owl is, how it works, and hopefully be inspired to see how you can use it for your needs. diff --git a/docs/getting_started/installation.md b/docs/getting_started/installation.md deleted file mode 100644 index e708de9713a..00000000000 --- a/docs/getting_started/installation.md +++ /dev/null @@ -1,46 +0,0 @@ -# Installation - -Snow Owl requires Java 11 or newer version. Specifically as of this writing, it is recommended that you use JDK (Oracle of OpenJDK is preferred) version 11.0.2. Java installation varies from platform to platform so we won’t go into those details here. Oracle’s recommended installation documentation can be found on Oracle’s website. Suffice to say, before you install Snow Owl, please check your Java version first by running (and then install/upgrade accordingly if needed): - -``` -java -version -echo $JAVA_HOME -``` - -Once we have Java set up, we can then download and run Snow Owl. The binaries are available at the [Releases](https://github.com/b2ihealthcare/snow-owl/releases) pages. For each release, you have a choice among a zip or tar archive, a DEB or RPM package. - -## Installation example with zip - -For simplicity, let's use a zip file. - -Let's download the most recent Snow Owl release as follows: - -``` -curl -L -O https://github.com/b2ihealthcare/snow-owl/releases/download//snow-owl-oss-.zip -``` - -Then extract it as follows: - -``` -unzip snow-owl-oss-.zip -``` - -It will then create a bunch of files and folders in your current directory. We then go into the bin directory as follows: - -``` -cd snow-owl-oss-/bin -``` - -And now we are ready to start the instance: - -``` -./startup -``` - -## Successfully running instance - -If everything goes well with the installation, you should see a bunch of log messages that look like below: - -``` -TODO example output -``` diff --git a/docs/getting_started/snomed/create.md b/docs/getting_started/snomed/create.md deleted file mode 100644 index c59490bc7de..00000000000 --- a/docs/getting_started/snomed/create.md +++ /dev/null @@ -1 +0,0 @@ -# Create a SNOMED CT Concept \ No newline at end of file diff --git a/docs/getting_started/snomed/export.md b/docs/getting_started/snomed/export.md deleted file mode 100644 index 0f851875380..00000000000 --- a/docs/getting_started/snomed/export.md +++ /dev/null @@ -1 +0,0 @@ -# Export SNOMED CT to RF2 \ No newline at end of file diff --git a/docs/getting_started/snomed/import.md b/docs/getting_started/snomed/import.md deleted file mode 100644 index 48d216ab69d..00000000000 --- a/docs/getting_started/snomed/import.md +++ /dev/null @@ -1,50 +0,0 @@ -# Import RF2 distribution - -Let's import an RF2 release in `SNAPSHOT` mode so that we can further explore the available SNOMED CT APIs! To do so, use the appropriate request from the [SNOMED CT Import API](../../api/snomed/import.md) as follows (the second `SNOMEDCT` in the request path represents the code system identifier): - -```bash -curl -v http://localhost:8080/snowowl/snomedct/SNOMEDCT/import?type=snapshot\&createVersions=false \ --F file=@SnomedCT_RF2Release_INT_20170731.zip -``` - -Curl will display the entire interaction between it and the server, including many request and response headers. We are interested in these two (response) rows in particular: - -``` -< HTTP/1.1 201 Created -< Location: http://localhost:8080/snowowl/snomedct/SNOMEDCT/import/107f6efa69886bfdd73db5586dcf0e15f738efed -``` - -The first one indicates that the file was uploaded successfully and a resource has been created to track import progress, while the second row indicates the location of this resource. - -{% hint style="info" %} -Depending on the size and type of the RF2 package, hardware and Snow Owl configuration, RF2 imports might take hours to complete. Official SNAPSHOT distributions can be imported in less than 30 minutes by allocating 6 GB of heap size to Snow Owl and configuring it to use a solid state disk for the data directory. -{% endhint %} - -The process itself is asynchronous and its status can be checked by periodically sending a GET request to the location indicated by the response header: - -```bash -curl http://localhost:8080/snowowl/snomedct/SNOMEDCT/import/107f6efa69886bfdd73db5586dcf0e15f738efed?pretty -``` - -The expected response while the import is running: - -```json -{ - "id" : "107f6efa69886bfdd73db5586dcf0e15f738efed", - "status" : "RUNNING" -} -``` - -Upon completion, you should receive a different response which lists component identifiers visited during the import as well as any defects encountered in uploaded release files: - -```json -{ - "id" : "107f6efa69886bfdd73db5586dcf0e15f738efed", - "status" : "FINISHED", - "response" : { - "visitedComponents" : [ ... ], - "defects" : [ ], - "success" : true - } -} -``` diff --git a/docs/getting_started/snomed/index.md b/docs/getting_started/snomed/index.md deleted file mode 100644 index 53f90b518f6..00000000000 --- a/docs/getting_started/snomed/index.md +++ /dev/null @@ -1,21 +0,0 @@ -# SNOMED CT - -Now that we have a code system, let's take a look at its content! We can list concepts using either the [SNOMED CT API](../../api/snomed/index.md) tailored to this tooling, or the [FHIR API](../../api/fhir/index.md) for a representation that is uniform across different kinds of code systems. For the sake of simplicity, we will use the former in this example. - -To list all available concepts in a code system, use the following command (just as with importing, the second `SNOMEDCT` in the request path represents the code system identifier): - -```bash -curl http://localhost:8080/snowowl/snomedct/SNOMEDCT/concepts?pretty -``` - -The expected response is: - -```json -{ - "items": [ ], - "limit": 50, - "total": 0 -} -``` - -The concept list is empty, indicating that we haven't imported anything into Snow Owl - yet. diff --git a/docs/getting_started/snomed/search.md b/docs/getting_started/snomed/search.md deleted file mode 100644 index dfad2403847..00000000000 --- a/docs/getting_started/snomed/search.md +++ /dev/null @@ -1,50 +0,0 @@ -# Search SNOMED CT Content - -## GET the ROOT concept: - -```bash -curl 'http://localhost:8080/snowowl/snomedct/MAIN/concepts/138875005' -``` - -And the response: - -```json -{ - "id": "138875005", - "released": true, - "active": true, - "effectiveTime": "20020131", - "moduleId": "900000000000207008", - "iconId": "138875005", - "definitionStatus": "PRIMITIVE", - "subclassDefinitionStatus": "NON_DISJOINT_SUBCLASSES" -} -``` - -## Search by ECL: - -```bash -curl 'http://localhost:8080/snowowl/snomedct/MAIN/concepts?active=true&ecl=%3C!138875005&limit=1' -``` - -And the response: - -```json -{ - "items": [ - { - "id": "308916002", - "released": true, - "active": true, - "effectiveTime": "20020131", - "moduleId": "900000000000207008", - "iconId": "138875005", - "definitionStatus": "PRIMITIVE", - "subclassDefinitionStatus": "NON_DISJOINT_SUBCLASSES" - } - ], - "searchAfter": "AoE_BWVlYzI3Mjc0LTYyZTctNDg3NS05NmVlLThhNTk3OTcxOTJiNw==", - "limit": 1, - "total": 19 -} -``` \ No newline at end of file diff --git a/docs/getting_started/snomed/version.md b/docs/getting_started/snomed/version.md deleted file mode 100644 index 0a0abc3b0ff..00000000000 --- a/docs/getting_started/snomed/version.md +++ /dev/null @@ -1 +0,0 @@ -# Version SNOMED CT \ No newline at end of file diff --git a/docs/migration/from-6x.md b/docs/migration/from-6x.md deleted file mode 100644 index c5905967ad2..00000000000 --- a/docs/migration/from-6x.md +++ /dev/null @@ -1,53 +0,0 @@ -# Migration from 6.x version - -The following major differences, features and topics are worth mentioning when comparing features present in Snow Owl 6 and 7 and migrating an existing 6.x deployment to Snow Owl 7.x. - -NOTE: It is highly recommended to keep the previous Snow Owl 6 deployment up and running until you have the data and all connected services migrated to the new version successfully. The new Snow Owl 7 system should get its own dedicated machine and deployment environment. Rolling back to the previous state should be available and must be executed when the upgrade cannot be performed successfully. - -## Java 11 - -From Snow Owl 7.1, Snow Owl compiles and runs on Java 11+ versions. It is recommended to use the latest OpenJDK or OracleJDK 11 LTS version. Install from [OpenJDK](https://openjdk.java.net/), [Oracle](https://www.oracle.com/java/technologies/javase-downloads.html) or [AdoptJDK](https://adoptopenjdk.net/). The Oracle JDK comes with commercial usage restrictions, see [here](https://www.oracle.com/technetwork/java/javase/overview/oracle-jdk-faqs.html) before installing. - -## RDBMS vs Elasticsearch - -While Snow Owl 6 was relying on two data sources for reading and writing data, a primary RDBMS (MySQL) for writing and a secondary Elasticsearch index for full-text search, queries and quick access, Snow Owl 7 in the other hand requires only a single data source, an Elasticsearch cluster. - -If you were using an external Elasticsearch cluster then we recommended installing the new Elasticsearch 7.x version first, then installing Snow Owl 7.x and finally connecting the two (or using the appropriate Docker images). -If you were using the embedded version, then installing the new Snow Owl 7 version is enough. - -After the migration, the MySQL software dependency can be uninstalled from the machine if there are no other services depending on it. - -## Database content - -Due to schema changes the old content present in the RDBMS and index cannot be used by a Snow Owl 7 installation. To migrate an existing dataset to the new version, perform an export in the old system and use the exported files to import the content back into the new Snow Owl 7 version. - -## LDAP Authorization - -The new Snow Owl 7 version comes with complete authorization support using JWT authorization tokens. The old `User - Role - Permission` system can be used by performing the following migration steps: - -1. Add the administrator permission to all administrator roles: `*:*` -2. Remove the `unused` permission values from all roles used by Snow Owl -3. Add the `classify:*` permission declaration and assign it to all roles that should be able to run classifications - -## Configuration changes - -Snow Owl 7 configuration file has been renamed to `snowowl.yml` (from `snowowl_config.yml`) and moved to the `/configuration` folder. - -The following configuration settings have been changed: -* `repository.database` configuration setting has been removed completely -* `repository.numberOfWorkers` has been renamed to `repository.maxThreads` and its default value became `200`. -* `metrics` settings has been renamed to `monitoring` - -Apply these changes to the configuration before starting your Snow Owl Terminology Server. - -## Startup and shutdown - -The old `startup.bat`, `startup.sh`, `shutdown.bat`, `shutdown.sh` have been replaced with the new `snowowl.sh`, `snowowl.bat` and `shutdown.sh` scripts. - -## Packaging - -Snow Owl 7 comes in four distribution formats: -* `zip`/`tar.gz` for manual deployments -* `rpm` for `CentOS/RHEL` based Linux system deployments -* `deb` for `Debian` based Linux system deployments -* `docker` for `Docker` based deployments \ No newline at end of file diff --git a/docs/migration/from-7x.md b/docs/migration/from-7x.md deleted file mode 100644 index 348ef3a6bd2..00000000000 --- a/docs/migration/from-7x.md +++ /dev/null @@ -1,14 +0,0 @@ -# Migration from 7.x version - -The following major differences, features and topics are worth mentioning when comparing features present in Snow Owl 7 and 8 and migrating an existing 7.x deployment to Snow Owl 8.x. - -NOTE: It is highly recommended to keep the previous Snow Owl 7 deployment up and running until you have the data and all connected services migrated to the new version successfully. The new Snow Owl 8 system should get its own dedicated machine and deployment environment. Rolling back to the previous state should be available and must be executed when the upgrade cannot be performed successfully. - -## Database content - -Due to resource and access management schema changes the old content present in a 7.x index cannot be used by a Snow Owl 8 installation. To migrate an existing dataset to the new version, perform an export in the old system and use the exported files to import the content back into the new Snow Owl 8 version. - -## Configuration changes - -The following configuration settings have been changed: -* Most of the `snomed` configuration keys have been added to runtime settings under the `CodeSystem.settings` property. If you have been using any of these configuration values, please raise a ticket [here](https://github.com/b2ihealthcare/snow-owl/issues/new/choose) and we will help you migrate your current installation to the new version. diff --git a/docs/sct_extensions/development.md b/docs/sct_extensions/development.md deleted file mode 100644 index 43db4625af4..00000000000 --- a/docs/sct_extensions/development.md +++ /dev/null @@ -1,42 +0,0 @@ -# SNOMED CT and Extension Development - -Authoring is the process by which content is created in an extension in accordance with a set of authoring principles. These principles ensure the quality of content and referential integrity between content in the extension and content in the International Edition (the principles are set by SNOMED International, can be found [here](https://confluence.ihtsdotools.org/display/DOCEXTPG/5.4+Authoring)). - -During the extension development process authors are: -* creating, modifying or inactivating content according to editorial principles and policies -* running validation processes to verify the quality and integrity of their Extension -* classifying their authored content with an OWL Reasoner to produce its distribution normal form - -The authors directly (via the available REST and FHIR APIs) or indirectly (via user interfaces, scripts, etc.) work with the Snow Owl Terminology Server to make the necessary changes for the next planned Extension release. - -## Workflow and Editing - -Authors often require a dedicated editing environment where they can make the necessary changes and let others review the changes they have made, so errors and issues can be corrected before integrating the change with the rest of the Extension. -Similarly to how SNOMED CT Extensions are separated from the SNOMED CT International Edition and other dependencies, this can be achieved by using branches. - -* [Branching API](../api/snomed/branching.md) - to create and merge branches -* [Compare API](../api/snomed/compare.md) - to compare branches - -![workflow-branch-authoring](images/workflow-branch-authoring.png "SNOMED CT Extension Feature Branches") - -## Authoring APIs - -To let authors make the necessary changes they need, Snow Owl offers the following SNOMED CT component endpoints to work with: - -* [Concept API](../api/snomed/concepts.md) - to create, edit SNOMED CT Concepts -* [Description API](../api/snomed/descriptions.md) - to create, edit SNOMED CT Descriptions -* [Relationship API](../api/snomed/relationships.md) - to create, edit SNOMED CT Relationships -* [Reference Set API](../api/snomed/refsets.md) - to create, edit SNOMED CT Reference Sets -* [Reference Set Member API](../api/snomed/members.md) - to create, edit SNOMED CT Reference Set Members - -## Validation - -To verify quality and integrity of the changes they have made, authors often generate reports and make further fixes according to the received responses. -In Snow Owl, reports and rules can be represented with validation queries and scripts. - -* [Validation API](../api/snomed/validation.md) - to run validation rules and fetch their reported issues on a per branch basis - -## Classification - -Last but not least, authors run an OWL Reasoner to classify their changes and generate the necessary normal form of their Extension. -The [Classification API](../api/snomed/classification.md) provides support for running these reasoner instances and generating the necessary normal form. diff --git a/docs/sct_extensions/extensions-and-snowowl.md b/docs/sct_extensions/extensions-and-snowowl.md deleted file mode 100644 index 8c0ed5803cf..00000000000 --- a/docs/sct_extensions/extensions-and-snowowl.md +++ /dev/null @@ -1,55 +0,0 @@ -# SNOMED CT Extension and Snow Owl - -Snow Owl is a multi-purpose terminology server with a main focus on SNOMED CT International Edition and its Extensions. Whether you are a producer of a SNOMED CT Extension or a consumer of one, Snow Owl has you covered. As always, feel free to ask your questions regarding any of the content you read here (raise a ticket on [GitHub Issues](https://github.com/b2ihealthcare/snow-owl/issues/new)). - -## Snow Owl Concepts - -Snow Owl uses the following basic concepts to provide authoring and maintenance support for SNOMED CT Extensions. - -### Code Systems - -From the [getting started](../getting_started/basic-concepts.md) page, we've learned what is a Repository and how Code Systems are defined as part of a Repository. - -{% hint style="info" %} -Reminder: a Repository is a set of schemas and functionality to provide support for a dedicated set of Code Systems, eg. the SNOMED CT Repository stores all SNOMED CT related components under revision control and provides quick access). A Repository can contain one or more Code Systems and by default always comes with one predefined Code System, the root Code System (in case of SNOMED CT, this is often represents the International Edition). -{% endhint %} - -SNOMED CT Extensions in Snow Owl are basically Code Systems with their own set of properties and characteristics. With Snow Owl's Code System API, a Code System can be created for each SNOMED CT Extension to easily identify the Code System and its components with a single unique identifer, called the Code System short name. -The recommended naming approach when selecting the unique short name identifier is the following: -* SNOMED CT International Edition: `SNOMEDCT` - often included in other editions for distribution purposes -* National Release Center (single maintained extension) - `SNOMEDCT-US` - represents the SNOMED CT United States of America Extension -* National Release Center (multiple maintained extensions) - `SNOMEDCT-UK-CL`, `SNOMEDCT-UK-DR` - United Kingdom Clinical and Drug Extensions, respectively -* Care Provider with a special extension based on a national extension - `SNOMEDCT-US-UNMC` - University of Nebraska Medical Center's extension builds on top of the `SNOMEDCT-US` extension - -The primary namespace identifer and set of modules and languages can be set during the creation of the Code System, and can be updated later on if required. -These properties can be used when users are accessing the terminology server for authoring purposes to provide a seamless authoring experience for the user without them needing to worry about selecting the proper namespace, modules, language tags, etc. (NOTE: this feature is not available yet in the OSS version of Snow Owl) - -#### Extension Of - -A Snow Owl Code System can be marked as an `extensionOf` another Code System, which ties them together, forming a dependency between the two Code Systems. A Code System can have multiple Extension Code Systems, but a Code System can only be `extensionOf` a single Code System. - -### Branching - -In Snow Owl, a Repository maintains a set of branches and Code Systems are always attached to a dedicated branch. For example, the default root Code Systems are always tied to the default branch, called `MAIN`. -When creating a new Code System, the "working" `branchPath` can be specified and doing so assigns the branch to the Code System. A Code System cannot be attached to multiple branches at the same time, and a branch can only be assigned to a single Code System in a Repository. -Snow Owl's branching infrastructure allows the use of isolated environments for both distribution and authoring workflows, therefore they play crucial role in SNOMED CT Extension managament as well. They also provide the support for seamless upgrade mechanism, which can be done whenever there is a new version available in one of your SNOMED CT Extension's dependent Code Systems. - -### Versions - -As in real life, a Code System can have zero or more versions (or with another name, releases). A version is a special branch that is created during the versioning process and makes the currently available latest content accessible later in its current form. Since SNOMED CT Extensions can have releases as well, creating a Code System Version in Snow Owl is a must in order to produce the release packages. - -### Examples - -The following image shows the repository content rendered from the available commits, after a successful International Edition import. - -![international-structure](images/basic-international-structure.png "SNOMED CT International Edition 2020-01-31") - -Dots represent commits made with the commit message on the right. -Green boxes represent where the associated branch's `HEAD` is currently located. -Blue tag labels represent versions created during the commit. - -If your use case would be to import the SNOMED CT US Extension 2019-09-01 version into this repository, then ideally it would look like this: - -![extension-structure](images/basic-extension-structure.png "SNOMED CT US Extension 2019-09-01") - -The next section describes the use case scenarios in the world of SNOMED CT and the recommended approaches for deploying these scenarios in Snow Owl. diff --git a/docs/sct_extensions/images/basic-edition-structure.png b/docs/sct_extensions/images/basic-edition-structure.png deleted file mode 100644 index 1f1032a95aaefcac3f7276ad08ea845e93ae5c4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18612 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 Z+#}DEXYeSebYRFlm&`0p%Z+c`|6gW+rkel& diff --git a/docs/sct_extensions/images/basic-extension-structure.png b/docs/sct_extensions/images/basic-extension-structure.png deleted file mode 100644 index a83587577dda4316391a4fd1f3f3d9d6a91c36dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19305 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 diff --git a/docs/sct_extensions/images/basic-international-structure.png b/docs/sct_extensions/images/basic-international-structure.png deleted file mode 100644 index 302dc0477373f056322262e102f600470c5b2325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12891 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 Vzhp;1k#xLl7#o=Bm+Rg||6lq8d=dZv diff --git a/docs/sct_extensions/images/extension-upgrade-available.png b/docs/sct_extensions/images/extension-upgrade-available.png deleted file mode 100644 index 139a1a65f5b5de1ffc3ed44721ae22bec0269ee3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17635 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 diff --git a/docs/sct_extensions/images/extension-upgrade-regular-maintenance.png b/docs/sct_extensions/images/extension-upgrade-regular-maintenance.png deleted file mode 100644 index 0bc3121bfc50ca862d5cdce969792e236ef8646d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31832 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 Yu2gaKACtvA?F}E~g3Wo%xf}QX5B!#E2><{9 diff --git a/docs/sct_extensions/images/extension-upgrade-start.png b/docs/sct_extensions/images/extension-upgrade-start.png deleted file mode 100644 index e463a4b74780965876061e37f123466630038d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26668 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 diff --git a/docs/sct_extensions/images/multi-extension.png b/docs/sct_extensions/images/multi-extension.png deleted file mode 100644 index 38347fe84a4d5c983c21835df27eb42dab12b81e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40480 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 zΠ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 sO~K)R-z#bU#S!*zc9tGPi|$eX1-~Ih;{X5v diff --git a/docs/sct_extensions/images/release-extension.png b/docs/sct_extensions/images/release-extension.png deleted file mode 100644 index 40bf06fa6baf3d6f166cbb37a76706978364a058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28610 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 diff --git a/docs/sct_extensions/images/workflow-branch-authoring.png b/docs/sct_extensions/images/workflow-branch-authoring.png deleted file mode 100644 index fbbb42025bf9c5bc20bed780095fd5626235d8af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25359 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 diff --git a/docs/sct_extensions/index.md b/docs/sct_extensions/index.md deleted file mode 100644 index f44137a413f..00000000000 --- a/docs/sct_extensions/index.md +++ /dev/null @@ -1,79 +0,0 @@ -# SNOMED CT Extension Management - -## Introduction - -The Snow Owl Terminology Server is capable of managing multiple SNOMED CT extensions for both distribution and authoring purposes in a single deployment. -This guide describes the typical scenarios, like creating, managing, releasing and upgrading SNOMED CT Extensions in great detail with images. -If you are unfamiliar with SNOMED CT Extensions, the next section walks you through their logical model and basic characteristics, while the following pages describe distribution and authoring scenarios as well as how to use the Snow Owl Terminology Server for SNOMED CT Extensions. - -[Extensions and Snow Owl](./extensions-and-snowowl.md) - -## What is a SNOMED CT Extension? - -{% hint style="info" %} -The official SNOMED CT Extension Practical Guide has been used to help produce the content available on this page: https://confluence.ihtsdotools.org/display/DOCEXTPG -{% endhint %} - -### Common Structure - -> SNOMED CT is a multilingual clinical terminology that covers a broad scope. However, some users may need additional concepts, relationships, descriptions or reference sets to support national, local or organizational needs. - -> The extension mechanism allows SNOMED CT to be customized to address the terminology needs of a country or organization that are not met by the International Edition. - -> A SNOMED CT Extension may contain components and/or derivatives (e.g. reference sets used to represent subsets, maps or language preferences). Since the international edition and all extensions share a common structure, the same application software can be used to enter, store and process information from different extensions. Similarly, reference sets can be constructed to refer to content from both the international release and extensions. The common structure also makes it easier for content developed by an extension producer to be submitted for possible inclusion in a National Edition or the International Edition. - -Therefore, a SNOMED CT Extension uses the same Release Format version 2 as the International Edition, they share a common structure and schema (see [Release Format 2 specification](http://snomed.org/rfs)). - -### Namespace - -> Extensions are managed by SNOMED International, and Members or Affiliate Licensees who have been issued a namespace identifier by SNOMED International. A namespace identifier is used to create globally unique SNOMED CT identifiers for each component (i.e. concept, description and relationship) within a Member or Affiliate extension. This ensures that references to extension concepts contained in health record data are unambiguous and can be clearly attributed to a specific issuing organization. - -> A national or local extension uses a namespace identifier issued by SNOMED International to ensure that all extension components can be uniquely identified (across all extensions). - -Therefore, a SNOMED CT Extension uses a single namespace identifier to identify all core components in the SNOMED CT Extension (see [Namespace identifier](https://confluence.ihtsdotools.org/display/DOCEXTPG/4.1+Namespaces)). - -### Modules - -> Every SNOMED CT Extension includes one or more modules, and each module contains either SNOMED CT components or reference sets (or both). Modules may be dependent on other modules. A SNOMED CT Edition includes the contents of a focus module together with the contents of all the modules on which it depends. This includes the modules in the International Edition and possibly other modules from a national and/or local extension. - -> An edition is defined based on a single focus module. This focus module must be the most dependent module, in that the focus module is dependent on all the other modules in the edition. - -Therefore, a SNOMED CT Extension uses one or more modules to categorize the components into meaningful groups (see [Modules](https://confluence.ihtsdotools.org/display/DOCEXTPG/4.2+Modules)). - -### Language - -> SNOMED CT extensions can support a variety of use cases, including: -> -> Translating SNOMED CT, for example -> * Adding terms used in a local language or dialect -> * Adding terms used by a specific user group, such as patient-friendly terms - -> Representing language, dialect or specialty-specific term preferences is possible using a SNOMED CT extension. The logical design of SNOMED CT enables a single clinical idea to be associated with a range of terms or phrases from various languages, as depicted in Figure 3.1-1 below. In an extension, terms relevant for a particular country, speciality, hospital (or other organization) may be created, and different options for term preferences may be specified. Even within the same country, different regional dialects or specialty-specific languages exist may influence which synonyms are preferred. SNOMED CT supports this level of granularity for language preferences at the national or local level. - -Therefore, an Extension can have its own language to support patient-friendly terms, local user groups, etc. (see [Purpose](https://confluence.ihtsdotools.org/display/DOCEXTPG/3+Purpose)). - -### Dependency - -> A SNOMED CT extension is a set of components and reference set members that add to the SNOMED CT International Edition. An extension is created, structured, maintained and distributed in accordance with SNOMED CT specifications and guidelines. Unlike, the International Edition an extension is not a standalone terminology. The content in an extension depends on the SNOMED CT International Edition, and must be used together with the International Edition and any other extension module on which it depends. - -Therefore, a SNOMED CT Extension depends on the SNOMED CT International Edition directly or indirectly through another SNOMED CT Extension (see [Extensions](https://confluence.ihtsdotools.org/display/DOCEXTPG/4.3+Extensions)). - -### Versions - -> A specific version of an extension can be referred to using the date on which the extension was published. - -> There are many use cases that require a date specific version of an edition, including specifying the substrate of a SNOMED CT query, and specifying the version of SNOMED CT used to code a specific data element in a health record. A versioned edition includes the contents of the specified version of the focus module, plus the contents of all versioned modules on which the versioned focus module depends (as specified in the |Module dependency reference set|). The version of an edition is based on the date on which the edition was released. Many extension providers release their extensions as a versioned edition, using regular and predictable release cycles. - -Therefore, a SNOMED CT Extension can be versioned and have a different release cycle than the SNOMED CT International Edition (see [Versions](https://confluence.ihtsdotools.org/display/DOCEXTPG/4.4+Editions)). - -## Characteristics - -To summarize, a SNOMED CT Extension has the following characteristics: -* Uses the same RF2 structure as the SNOMED CT International Edition -* Uses a single namespace identifer to globally identify its content -* Uses one or more modules to categorize the content into groups -* Uses one or more languages to support specific user groups and patient-friendly terms -* Depends on the SNOMED CT International Edition -* Uses versions (effective times) to identity its content across multiple releases - -Now that we have a clear understanding of what SNOMED CT Extensions are, let's take a look at how can we use them in Snow Owl. diff --git a/docs/sct_extensions/integrations.md b/docs/sct_extensions/integrations.md deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/docs/sct_extensions/release.md b/docs/sct_extensions/release.md deleted file mode 100644 index 80a27513afe..00000000000 --- a/docs/sct_extensions/release.md +++ /dev/null @@ -1,28 +0,0 @@ -# Extension Releases and Distribution - -When an Extension reaches the end of its current development cycle, it needs to be prepared for release and distribution. - -## Workflows and Authoring Branches - -All planned content changes that are still on their dedicated branch either need to be integrated with the main development version or removed from the scope of the next release. - -![workflow-branch-authoring](images/workflow-branch-authoring.png "SNOMED CT Extension Feature Branches") - -## Prepare the Release - -After all development branches have been merged and integrated with the main work-in-progress version, the Extension needs to be prepared for release. -This usually involves last minute fixes, running quality checks and validation rules and generating the final necessary normal form of the Extension. - -![prepare-for-release](images/prepare-for-release.png "Last minute changes before the Release") - -## Release - -When all necessary steps have been performed successfully, a new Code System Version needs to be created in Snow Owl to represent the latest release. -The versioning process will assign the requested `effectiveTime` to all unpublished components, update the necessary Metadata reference sets (like the Module Dependency Reference Set) and finally create a version branch to reference this release later. - -![release-extension](images/release-extension.png "Releasing a SNOMED CT Extension") - -## Packaging - -After a successful release, an RF2 Release Package needs to be generated for downstream consumers of your Extension. -Snow Owl can generate this final RF2 Release Packages for the newly released version via the [RF2 Export API](../api/snomed/export.md). diff --git a/docs/sct_extensions/scenarios/index.md b/docs/sct_extensions/scenarios/index.md deleted file mode 100644 index da188b6f1b6..00000000000 --- a/docs/sct_extensions/scenarios/index.md +++ /dev/null @@ -1,8 +0,0 @@ -# Scenarios - -This section describes the use case scenarios present in the world of SNOMED CT and how Snow Owl can be used in those scenarios to maximize its full potential. -Each scenario comes with a summary and a pros/cons section to help your decision making process when selecting the appropriate scenario for your use case. - -* [Single Edition](./single-edition.md) -* [Single Extension](./single-extension.md) -* [Multi Extension](./multi-extension.md) diff --git a/docs/sct_extensions/scenarios/multi-extension.md b/docs/sct_extensions/scenarios/multi-extension.md deleted file mode 100644 index caa4d060742..00000000000 --- a/docs/sct_extensions/scenarios/multi-extension.md +++ /dev/null @@ -1,17 +0,0 @@ -# Multi Extension Authoring and Distribution - -On top of single Edition/Extension distribution and authoring, Snow Owl provides full support for multi-SNOMED CT distribution and authoring even if the Extensions depend on different versions of the SNOMED CT International Edition. - -![multi-extension](../images/multi-extension.png "Snow Owl Multi-Extension Deployment") - -To achieve a deployment like this you need to perform the same initialization steps for each desired SNOMED CT Extension as if it were a single extension scenario (see [single extension](./single-extension.md)). -Development and maintenance of each managed extension can happen in parallel without affecting one or the other. Each of them can have their own release cycles, maintenance and upgrade schedules, and so on. - -# Next steps - -After you have initialized your Snow Owl instance with the Extensions you'd like to maintain the next steps are: - -* [Development](../development.md) -* [Release](../release.md) -* [Upgrade](../upgrade.md) -* [Integrate](../integrations.md) diff --git a/docs/sct_extensions/scenarios/single-edition.md b/docs/sct_extensions/scenarios/single-edition.md deleted file mode 100644 index 33e34088d31..00000000000 --- a/docs/sct_extensions/scenarios/single-edition.md +++ /dev/null @@ -1,35 +0,0 @@ -# Single Edition - -The most common use case to consume a SNOMED CT Release Package is to import it directly into a Terminology Server (like Snow Owl) and make it available as read-only content for both human and machine access (via REST and FHIR APIs). - -## SNOMED CT International Edition - -Since Snow Owl by default comes with a pre-initialized SNOMED CT Code System called `SNOMEDCT`, it is just a single call to import the official RF2 package using the [SNOMED CT RF2 Import API](../../api/snomed/import.md) -The import by default creates a Code System Version for each SNOMED CT Effective Date available in the supplied RF2 package. -After a successful import the content is immediately available via REST and FHIR APIs. - -![international-structure](../images/basic-international-structure.png "SNOMED CT International Edition 2020-01-31") - -## SNOMED CT Extension Edition - -National Release Centers and other Care Providers provide their own SNOMED CT Edition distribution for third-party consumers in RF2 format. Importing their Edition distribution instead of the International Edition directly into the `SNOMEDCT` pre-initialized SNOMED CT Code System with the same [SNOMED CT RF2 Import API](../../api/snomed/import.md) makes both the International Edition (always included in Edition packages) and the National Extension available for read-only access. - -![basic-edition-structure](../images/basic-edition-structure.png "SNOMED CT US Edition 2020-03-01") - -## Summary - -The single edition scenario without much effort provides access to any SNOMED CT Edition directly on the pre-initialized `SNOMEDCT` Code System. It is easy to set up and maintain. -Because of its flat structure, it is good for distribution and extension consumers. Although it can be used for authoring in certain scenarios, due to the missing distinction between the International Edition and the Extension, it is not the best choice for extension authoring and maintenance. - -{% hint style="info" %} -This scenario can be further extended to support multiple simultaneous Edition releases living on their own dedicated SNOMED CT Code Systems. The Root `SNOMEDCT` Code System in this case is empty and only serves the purpose of creating other Code Systems "underneath" it. Each SNOMED CT Code System is then imported into its own dedicated branch forming a star-like branch structure at the end (zero-length `MAIN` branch and content branches). This is useful in distribution scenarios, where multiple Extension Code Systems need to be maintained with their own dedicated set of dependencies and there is no time to set up the proper Extension Scenario (see next section). The only drawback of this setup is the potentially high usage of disk space due to the overlap between the various Editions imported into their own Code Systems (since each of them contains the entire International Release). -{% endhint %}# - -Pros: -* Good for maintaining the SNOMED CT International Edition -* Good for distribution -* Simple to set up and maintain - -Cons: -* Not recommended for extension authoring and maintenance -* Not recommended for multi-extension distribution scenarios diff --git a/docs/sct_extensions/scenarios/single-extension.md b/docs/sct_extensions/scenarios/single-extension.md deleted file mode 100644 index 12dd3b8df54..00000000000 --- a/docs/sct_extensions/scenarios/single-extension.md +++ /dev/null @@ -1,43 +0,0 @@ -# Single Extension Authoring and Distribution - -A typical extension scenario is the development of the extension itself. Whether you are starting your extension from scratch or already have a well-developed version that you need to maintain, the first choice you need to make is to identify the dependencies of your SNOMED CT Extension. - -## Extending the International Edition - -If your Extension extends the SNOMED CT International Edition directly, then you need to pick one of the available International Edition versions: -* If you are starting from scratch, it is always recommended to select the latest International Release as the starting point of your Extension. -* If you have an existing Extension then you probably already know the International Release version your Extension depends on. - -When you have identified the version you need to depend on then you need to import that version (or a later release packages that also includes that version in its FULL RF2 package) first into Snow Owl. Make sure that the `createVersion` feature of the RF2 import process is enabled, so it will automatically create the versions for each imported RF2 `effectiveTime` value. - -After you have successfully imported all dependencies into Snow Owl, the next step is to create a Code System that represents your SNOMED CT Extension (see [Core API](../../api/admin/index.md)). -When creating the Code System, besides specifying the namespace and optional modules and languages, you need to enter a Code System `shortName`, which will serve as the unique identifier of your Extension and select the `extensionOf` value, which represents the dependency of the Code System. - -![extension-from-scratch](../images/extension-from-scratch.png "SNOMED CT My Extension based on the International Edition 2020-01-31") - -After you have successfully created the Code System representing your Extension, you can import any existing content from a most recent release or start from scratch by creating the module concept of your extension. - -{% hint style="info" %} -RF2 releases tend to have content issues with the International Edition itself or refer to missing content when you try to import them into Snow Owl via the RF2 Import API. For this reason, the recommended way is to always use the most recent Snapshot RF2 release of a SNOMED CT Extension to form its first representation in Snow Owl. That has a high probability of success without any missing component dependency errors during import. If you are having trouble importing an RF2 Release Package into Snow Owl, feel free to raise a question on our [GitHub Issues](https://github.com/b2ihealthcare/snow-owl/issues/new) page. -{% endhint %}# - -## Extending another Extension - -If your Extension needs to extend another Extension and not the International Edition itself, then you need to identify the version you'd like to depend on in that Extension (that indirectly will select the International Edition dependency as well). When you have identified all required versions, then starting from the International Edition recursively traverse back and repeat the RF2 Import and Code System creation steps described in the previous section until you have finally imported your extension. In the end your extension might look like this, depending on how many Extensions you are depending on. - -![extension-extends-another](../images/extension-extends-another.png "SNOMED CT UNMC Extension 2019-10-31 extends SNOMED CT US 2019-09-01") - -## Summary - -Setting up a Snow Owl deployment like this is not an easy task. It requires a thorough understanding of each SNOMED CT Extension you'd like to import and their dependencies as well. -However, after the initial setup, the maintenance of your Extension becomes straightforward, thanks to the clear distinction from the International Edition and from its other dependencies. -The release process is easier and you can choose to publish your Extension as an extension only release, or as an Edition or both (see [Release](../release.md)). -Additionally, when a new version is available in one of the dependencies, you will be able to upgrade your Extension with the help of automated validation rules and upgrade processes (see [Upgrade](../upgrade.md)). -From the distribution perspective, this scenario shines when you need to maintain multiple Extensions/Editions in a single deployment. - -Pros: -* Excellent for authoring and maintenance -* Good for distribution - -Cons: -* Harder to set up the initial deployment diff --git a/docs/sct_extensions/upgrade.md b/docs/sct_extensions/upgrade.md deleted file mode 100644 index a18a8d865a1..00000000000 --- a/docs/sct_extensions/upgrade.md +++ /dev/null @@ -1,65 +0,0 @@ -# Extension Maintenance and Upgrades - -Maintenance of a SNOMED CT Extension is essential to ensure that -* it incorporates changes requested by terminology consumers -* it remains aligned with the SNOMED CT International Edition - -While both of these maintenance related tasks are potentially assigned to one of the upcoming Extension development cycles, there is a clear distinction between the two maintenance tasks. - -{% hint style="info" %} -See additional Extension maintenance related material in the official [Extensions Practical Guide](https://confluence.ihtsdotools.org/display/DOCEXTPG/5.7+Maintenance). -{% endhint %}# - -## Change requests - -Changes requested by your terminology consumers are typically content authoring tasks that you would assign to an Extension authoring team. They usually come with a well-described problem you need to address in the terminology as you would do in the usual development cycle. - -See the [Extension Development](./development.md) section on how you can address change requests and incorporate them as regular tasks into the main version of your Extension. - -## International Edition Changes - -Aligning content to the SNOMED CT International Edition is one of the main responsibilities of an Extension maintainer. However, keeping up with the changes introduced in SNOMED CT International Edition biannually (on January 31st and July 31st) can be an overwhelming task, especially if: -* you are under pressure from your terminology consumers to make the requested changes ASAP, especially in mission critical scenarios. -* the changes introduced in the International Edition are conflicting with your local changes and/or causing maintenance related issues after the upgrade. - -To address SNOMED CT International Edition upgrade tasks in a reliable and reproducible way, Snow Owl offers an upgrade flow for SNOMED CT Extensions. - -## Upgrades - -A Code System upgrade in Snow Owl is a complex workflow with states and steps. The workflow involves a special Upgrade Code System, a series of automated migration processes and validation rules to ensure the quality and reliability of the operation. The upgrade can be done quickly if there were no conflicts between the Extension and the International Edition. However, updates can also be a long-running process spanning over many months when significant structural changes (e.g. in substances, anatomy, or modeling approach) are made in the International Edition. - -### Starting the Upgrade - -In Snow Owl, SNOMED CT Extension are linked to their SNOMED CT dependency with the `extensionOf` property. This property describes the International Edition and its version that the Extension depends on. For example, the `SNOMEDCT/2019-07-31` value specifies that our Extension depends on the 2019-07-31 version of the International Edition. - -Extension upgrades can be started when there is a new version available in the Extension/Edition we have selected as our dependency in the `extensionOf` property. When fetching a SNOMED CT Code System via the Code System API, Snow Owl will check if there are any upgrades availables and return them in the `availableUpdates` array property. If there are no upgrades available the array will be empty. - -![extension-upgrade-available](images/extension-upgrade-available.png "SNOMEDCT-MYEXT can be upgraded to SNOMEDCT/2020-01-31") - -To start an Extension upgrade to a newer International Edition (or to a newer Extension dependency version), you can use the [Upgrade API](../api/admin/upgrade.md). The only thing that needs to be specified there is the desired new version of the Extension's `extensionOf` dependency. - -When the upgrade is started, Snow Owl creates a special `-UP-` (eg. `SNOMEDCT-MYEXT-UP-SNOMEDCT-2020-01-31`) Code System to allow authors and the automated processes to migrate the latest development version of the Extension to the new dependency. - -![extension-upgrade-start](images/extension-upgrade-start.png "SNOMEDCT-MYEXT is upgrading to SNOMEDCT/2020-01-31") - -### Regular Maintenance - -Regular daily Extension development tasks still need to be resolved and pushed somewhere in order to continue the development of the Extension, even if an upgrade process is in progress. Each Extension still has an active development version, even if an upgrade is in progress, which can be used to push daily maintenance changes and business as usual tasks. - -![extension-upgrade-regular-maintenance](images/extension-upgrade-regular-maintenance.png "SNOMEDCT-MYEXT is being developed and upgraded at the same time") - -Changes pushed to the development area will regularly need to be synced with the upgrade until the upgrade completes, so the upgrade team will be able to resolve all remaining conflicts and issues. - -### Upgrade Checks - -Upgrade Checks ensure the quality of the upgrade process and execute certain tasks/checks automatically. An Upgrade Check can be any logic or function to be run during the upgrade. Upgrade Checks can access the underlying upgrade Code System's content and report any issues (validation rules) or fix content automatically (migration rules). For example, a validation rule (like `Active relationships must have active source, type, destination references`) can be executed after each change pushed to the upgrade branch to verify whether there is any potentially invalid relationship left to fix or you are ready to go. - -### Completing the Upgrade - -Once the upgrade authoring team is done with the necessary changes to align the Extension with the new International Edition and all the checks are completed successfully the upgrade can be completed. -Completing the upgrade performs the following steps: -* Creates a `-DO-` Code System to refer to the previous state of the Extension -* Changes the current working branch of the Extension Code System to the branch that was used during the upgrade process -* Deletes the `-UP-` Code System, which marks the upgrade complete, and the upgrade itself cannot be accessed anymore. - -![extension-upgrade-complete](images/extension-upgrade-complete.png "SNOMEDCT-MYEXT has been upgraded to International Edition 2020-01-31") diff --git a/docs/setup/configure/disable-swap.md b/docs/setup/configure/disable-swap.md deleted file mode 100644 index 99f09976132..00000000000 --- a/docs/setup/configure/disable-swap.md +++ /dev/null @@ -1,29 +0,0 @@ -# Disable swapping - -Most operating systems try to use as much memory as possible for file system caches and eagerly swap out unused application memory. This can result in parts of the JVM heap or even its executable pages being swapped out to disk. - -Swapping is very bad for performance, and should be avoided at all costs. It can cause garbage collections to last for minutes instead of milliseconds and can cause services to respond slowly or even time out. - -There are two approaches to disabling swapping. The preferred option is to completely disable swap, but if this is not an option, you can minimize swappiness. - -## Disable all swap files - -Usually Snow Owl is the only service running on a box, and its memory usage is controlled by the JVM options. There should be no need to have swap enabled. - -On Linux systems, you can disable swap temporarily by running: - -``` -sudo swapoff -a -``` - -To disable it permanently, you will need to edit the `/etc/fstab` file and comment out any lines that contain the word `swap`. - -## Configure swappiness - -Another option available on Linux systems is to ensure that the sysctl value `vm.swappiness` is set to 1. This reduces the kernel’s tendency to swap and should not lead to swapping under normal circumstances, while still allowing the whole system to swap in emergency conditions. - -``` -# sysctl settings, to be added to /etc/sysctl.conf or equivalent -vm.swappiness = 1 -vm.max_map_count = 262144 -``` \ No newline at end of file diff --git a/docs/setup/configure/elasticsearch.md b/docs/setup/configure/elasticsearch.md deleted file mode 100644 index 752868ce542..00000000000 --- a/docs/setup/configure/elasticsearch.md +++ /dev/null @@ -1,21 +0,0 @@ -# Elasticsearch configuration - -By default, Snow Owl is starting and connecting to an embedded `Elasticsearch` cluster available on `http://localhost:9200`. This cluster has only a single node and its discovery method is set to `single-node`, which means it is not able to connect to other Elasticsearch clusters and will be used exclusively by Snow Owl. - -This single node Elasticsearch cluster can easily serve Snow Owl in testing, evaluation and small authoring environments, but it is recommended to customize how Snow Owl connects to an Elasticsearch cluster in larger environments (especially when planning to scale with user demand). - -You have two options to configure Elasticsearch used by Snow Owl. - -## Configure the embedded instance - -The first option is to configure the underlying Elasticsearch instance by editing the configuration file `elasticsearch.yml`, which depending on your installation is available in the configuration directory (you can create the file, if it is not available, Snow Owl will pick it up during the next startup). - -{% hint style="info" %} -The embedded Elasticsearch version is `6.3.2`. If you are configuring it to connect to an existing Elasticsearch cluster, then make sure that the cluster version matches with this version. -{% endhint %} - -## Connect to a remote cluster - -The second option is to configure Snow Owl to use a remote Elasticsearch cluster without the embedded instance. In order to use this feature you need to set the `repository.index.clusterUrl` configuration parameter to the remote address of your Elasticsearch cluster. When Snow Owl is configured to connect to a remote Elasticsearch cluster, it won't boot up the embedded instance, which reduces the memory requirements of Snow Owl slightly. - -You can connect to self-hosted clusters or hosted solutions provided by [AWS](https://aws.amazon.com/elasticsearch-service/) and [Elastic.co](https://www.elastic.co/cloud/elasticsearch-service) for example. diff --git a/docs/setup/configure/file-descriptors.md b/docs/setup/configure/file-descriptors.md deleted file mode 100644 index 2b3698eba19..00000000000 --- a/docs/setup/configure/file-descriptors.md +++ /dev/null @@ -1,11 +0,0 @@ -# File Descriptors - -{% hint style="info" %} -This is only relevant if you are running Snow Owl with an embedded Elasticsearch and not connecting it to an existing cluster. -{% endhint %} - -Snow Owl (with embedded Elasticsearch) uses a lot of file descriptors or file handles. Running out of file descriptors can be disastrous and will most probably lead to data loss. Make sure to increase the limit on the number of open files descriptors for the user running Snow Owl to 65,536 or higher. - -For the `.zip` and `.tar.gz` packages, set `ulimit -n 65536` as root before starting Snow Owl, or set `nofile` to `65536` in `/etc/security/limits.conf`. - -RPM and Debian packages already default the maximum number of file descriptors to `65536` and do not require further configuration. \ No newline at end of file diff --git a/docs/setup/configure/important-settings.md b/docs/setup/configure/important-settings.md deleted file mode 100644 index 1dd8d49556a..00000000000 --- a/docs/setup/configure/important-settings.md +++ /dev/null @@ -1,59 +0,0 @@ -# Important Snow Owl configuration - -While Snow Owl requires very little configuration, there are a number of settings which need to be considered before going into production. - -The following settings **must** be considered before going to production: - -## Elasticsearch settings - -By default, Snow Owl includes the OSS version of Elasticsearch and runs it in embedded mode to store terminology data and make it available for search. This is convenient for single node environments (eg. for evaluation, testing and development), but it might not be sufficient when you go into production. - -To configure Snow Owl to connect to an Elasticsearch cluster, change the `clusterUrl` property in the `snowowl.yml` configuration file: - -```yml -repository: - index: - clusterUrl: http://your.es.cluster:9200 # the ES cluster URL - clusterUsername: snowowl # Optional username to connect to a protected ES cluster - clusterPassword: snowowl_password # Optional password to connect to a protected ES cluster -``` - -The value for this setting should be a valid HTTP URL point to the HTTP API of your Elasticsearch cluster, which by default runs on port `9200`. - -## Path settings - -If you are using the `.zip` or `.tar.gz` archives, the data and logs directories are sub-folders of `$SO_HOME`. If these important folders are left in their default locations, there is a high risk of them being deleted while upgrading Snow Owl to a new version. - -In production use, you will almost certainly want to change the locations of the data and log folders. - -```yml -path: - data: /var/data/snowowl -``` - -The RPM and Debian distributions already use custom paths for data and logs. - -## Network settings - -To allow clients to connect to Snow Owl, make sure you open access to the following ports: -* 8080/TCP:: Used by Snow Owl Server's REST API for HTTP access -* 8443/TCP:: Used by Snow Owl Server's REST API for HTTPS access -* 2036/TCP:: Used by the Net4J binary protocol connecting Snow Owl clients to the server - -## Setting the heap size - -By default, Snow Owl tells the JVM to use a heap with a minimum and maximum size of 2 GB. When moving to production, it is important to configure heap size to ensure that Snow Owl has enough heap available. - -To configure the heap size settings, change the `-Xms` and `-Xmx` settings in the `SO_JAVA_OPTS` environment variable. - -```bash -# Set the minimum and maximum heap size to 12 GB. -SO_JAVA_OPTS="-Xms12g -Xmx12g" ./bin/startup -``` - -The value for these setting depends on the amount of RAM available on your server and whether you are running Elasticsearch on the some node as Snow Owl (either embedded or as a service) or running it in its own cluster. Good rules of thumb are: - -* Set the minimum heap size (`Xms`) and maximum heap size (`Xmx`) to be equal to each other. -* Too much heap can subject to long garbage collection pauses. -* Set `Xmx` to no more than 50% of your physical RAM, to ensure that there is enough physical RAM left for kernel file system caches. -* Snow Owl connecting to a remote Elasticsearch cluster requires less memory, but make sure you still allocate enough for your use cases (classification, batch processing, etc.). \ No newline at end of file diff --git a/docs/setup/configure/index.md b/docs/setup/configure/index.md deleted file mode 100644 index 05cf47f047c..00000000000 --- a/docs/setup/configure/index.md +++ /dev/null @@ -1,46 +0,0 @@ -# Configuring Snow Owl - -Snow Owl ships with good defaults and requires very little configuration. - -## Config files location -Snow Owl has three configuration files: - -* `snowowl.yml` for configuring Snow Owl -* `serviceability.xml` for configuring Snow Owl logging -* `elasticsearch.yml` for configuring the underlying Elasticsearch instance in case of embedded deployments - -These files are located in the config directory, whose default location depends on whether or not the installation is from an archive distribution (`tar.gz` or `zip`) or a package distribution (Debian or RPM packages). - -For the archive distributions, the config directory location defaults to `$SO_PATH_HOME/configuration`. The location of the config directory can be changed via the `SO_PATH_CONF` environment variable as follows: - -``` -SO_PATH_CONF=/path/to/my/config ./bin/startup -``` - -Alternatively, you can export the `SO_PATH_CONF` environment variable via the command line or via your shell profile. - -For the package distributions, the config directory location defaults to `/etc/snowowl`. The location of the config directory can also be changed via the `SO_PATH_CONF` environment variable, but note that setting this in your shell is not sufficient. Instead, this variable is sourced from `/etc/default/snowowl` (for the Debian package) and `/etc/sysconfig/snowowl` (for the RPM package). You will need to edit the `SO_PATH_CONF=/etc/snowowl` entry in one of these files accordingly to change the config directory location. - -## Config file format - -The configuration format is [YAML](http://www.yaml.org/). Here is an example of changing the path of the data directory: - -``` -path: - data: /var/lib/snowowl -``` - -Settings can also be flattened as follows: - -``` -path.data: /var/lib/snowowl -``` - -### Environment variable substitution - -Environment variables referenced with the `${...}` notation within the configuration file will be replaced with the value of the environment variable, for instance: - -``` -repository.host: ${HOSTNAME} -repository.port: ${SO_REPOSITORY_PORT} -``` \ No newline at end of file diff --git a/docs/setup/configure/jvm.md b/docs/setup/configure/jvm.md deleted file mode 100644 index 5062db87853..00000000000 --- a/docs/setup/configure/jvm.md +++ /dev/null @@ -1,17 +0,0 @@ -# Setting JVM options - -You should rarely need to change Java Virtual Machine (JVM) options. If you do, the most likely change is setting the [heap size](important-settings.md). - -The preferred method of setting JVM options (including system properties and JVM flags) is via the the `SO_JAVA_OPTS` environment variable. For instance: - -``` -export SO_JAVA_OPTS="$SO_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir" -./bin/startup -``` - -When using the RPM or Debian packages, `SO_JAVA_OPTS` can be specified in the system configuration file. - -{% hint style="info" %} -Some other Java programs support the `JAVA_OPTS` environment variable. This is not a mechanism built into the JVM but instead a convention in the ecosystem. However, we do **not** support this environment variable, instead supporting setting JVM options via the environment variable `SO_JAVA_OPTS` as above. -{% endhint %} - diff --git a/docs/setup/configure/logging.md b/docs/setup/configure/logging.md deleted file mode 100644 index d90d5f620be..00000000000 --- a/docs/setup/configure/logging.md +++ /dev/null @@ -1,7 +0,0 @@ -# Logging configuration - -Snow Owl uses [SLF4J](https://www.slf4j.org/) and [Logback](https://logback.qos.ch/) for logging. - -The logging configuration file (`serviceability.xml`) can be used to configure Snow Owl logging. The logging configuration file location depends on your installation method, by default it is located in the `${SO_HOME}/configuration` folder. - -Extensive information on how to customize logging and all the supported appenders can be found on the [Logback documentation](https://logback.qos.ch/manual/configuration.html). \ No newline at end of file diff --git a/docs/setup/configure/nthreads.md b/docs/setup/configure/nthreads.md deleted file mode 100644 index f4d67ddfecf..00000000000 --- a/docs/setup/configure/nthreads.md +++ /dev/null @@ -1,7 +0,0 @@ -# Number of threads - -Snow Owl uses a number of thread pools for different types of operations. It is important that it is able to create new threads whenever needed. Make sure that the number of threads that the Snow Owl user can create is at least `4096`. - -This can be done by setting `ulimit -u 4096` as root before starting Snow Owl, or by setting `nproc` to `4096` in `/etc/security/limits.conf`. - -The package distributions when run as services under systemd will configure the number of threads for the Snow Owl process automatically. No additional configuration is required. \ No newline at end of file diff --git a/docs/setup/configure/system-settings.md b/docs/setup/configure/system-settings.md deleted file mode 100644 index a27423022f8..00000000000 --- a/docs/setup/configure/system-settings.md +++ /dev/null @@ -1,85 +0,0 @@ -# Important System Configuration - -Ideally, Snow Owl should run alone on a server and use all of the resources available to it. In order to do so, you need to configure your operating system to allow the user running Snow Owl to access more resources than allowed by default. - -The following settings **must** be considered before going to production: - -* [Disable swapping](disable-swap.md) -* [Increase file descriptors](file-descriptors.md) -* [Ensure sufficient virtual memory](virtual-mem.md) -* [Ensure sufficient threads](nthreads.md) -* [Tweaking for performance](tweaking.md) - -## Configuring system settings - -Where to configure systems settings depends on which package you have used to install Snow Owl, and which operating system you are using. - -When using the `.zip` or `.tar.gz` packages, system settings can be configured: - -* temporarily with [ulimit](#ulimit), or -* permanently in [/etc/security/limits.conf](#/etc/security/limits.conf). - -When using the RPM or Debian packages, most system settings are set in the system configuration file. However, systems which use systemd require that system limits are specified in a systemd configuration file. - -## ulimit - -On Linux systems, `ulimit` can be used to change resource limits on a temporary basis. Limits usually need to be set as root before switching to the user that will run Snow Owl. For example, to set the number of open file handles (`ulimit -n`) to `65,536`, you can do the following: - -```bash -sudo su # Become `root` -ulimit -n 65536 # Change the max number of open files -su snowowl # Become the `snowowl` user in order to start Snow Owl -``` - -The new limit is only applied during the current session. - -You can consult all currently applied limits with `ulimit -a`. - -## /etc/security/limits.conf - -On Linux systems, persistent limits can be set for a particular user by editing the `/etc/security/limits.conf` file. To set the maximum number of open files for the `snowowl` user to `65,536`, add the following line to the limits.conf file: - -``` -snowowl - nofile 65536 -``` - -This change will only take effect the next time the `snowowl` user opens a new session. - -{% hint style="info" %} -## Ubuntu and limits.conf -Ubuntu ignores the `limits.conf` file for processes started by `init.d`. To enable the `limits.conf` file, edit `/etc/pam.d/su` and uncomment the following line: - -``` -# session required pam_limits.so -``` -{% endhint %} - -## Sysconfig file - -When using the RPM or Debian packages, system settings and environment variables can be specified in the system configuration file, which is located in: - -| Package | Location | -| ------- | -------- | -| RPM | /etc/sysconfig/snowowl | -| Debian | /etc/default/snowowl | - -However, for systems which uses systemd, system limits need to be specified via systemd. - -## Systemd configuration - -When using the RPM or Debian packages on systems that use systemd, system limits must be specified via systemd. - -The systemd service file (/usr/lib/systemd/system/snowowl.service) contains the limits that are applied by default. - -To override them, add a file called /etc/systemd/system/snowowl.service.d/override.conf (alternatively, you may run `sudo systemctl edit snowowl` which opens the file automatically inside your default editor). Set any changes in this file, such as: - -``` -[Service] -LimitMEMLOCK=infinity -``` - -Once finished, run the following command to reload units: - -``` -sudo systemctl daemon-reload -``` \ No newline at end of file diff --git a/docs/setup/configure/tweaking.md b/docs/setup/configure/tweaking.md deleted file mode 100644 index 87cc370b355..00000000000 --- a/docs/setup/configure/tweaking.md +++ /dev/null @@ -1,8 +0,0 @@ -# Tweaking for performance - -## Scheduler - -```bash -# noop I/O scheduler, should be set in eg. /etc/rc.local for solid state disks: -echo noop > /sys/block/sdX/queue/scheduler -``` \ No newline at end of file diff --git a/docs/setup/configure/virtual-mem.md b/docs/setup/configure/virtual-mem.md deleted file mode 100644 index 7ee489e4bc1..00000000000 --- a/docs/setup/configure/virtual-mem.md +++ /dev/null @@ -1,13 +0,0 @@ -# Virtual memory - -Snow Owl uses a `mmapfs` directory by default to store its data. The default operating system limits on mmap counts is likely to be too low, which may result in out of memory exceptions. - -On Linux, you can increase the limits by running the following command as root: - -``` -sysctl -w vm.max_map_count=262144 -``` - -To set this value permanently, update the `vm.max_map_count` setting in `/etc/sysctl.conf`. To verify after rebooting, run `sysctl vm.max_map_count`. - -The RPM and Debian packages will configure this setting automatically. No further configuration is required. \ No newline at end of file diff --git a/docs/setup/index.md b/docs/setup/index.md deleted file mode 100644 index 9ad0b35db05..00000000000 --- a/docs/setup/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Set up Snow Owl - -This section includes information on how to setup Snow Owl and get it running, including: - -* Downloading -* Installing -* Starting -* Configuring - -## Java (JVM) Version - -Snow Owl is built using Java, and requires at least Java 11 in order to run. Only Oracle’s Java and the OpenJDK are supported. The same JVM version should be used on all Snow Owl nodes and clients. - -We recommend installing Java version 11.0.x or a later version in the Java 11 release series. We recommend using a supported LTS version of Java. - -The version of Java that Snow Owl will use can be configured by setting the JAVA_HOME environment variable. \ No newline at end of file diff --git a/docs/setup/install/debian.md b/docs/setup/install/debian.md deleted file mode 100644 index a051d8ce355..00000000000 --- a/docs/setup/install/debian.md +++ /dev/null @@ -1,102 +0,0 @@ -# Install Snow Owl with Debian Package - -The Debian package for Snow Owl can be downloaded from the Downloads section. It can be used to install Snow Owl on any Debian-based system such as Debian and Ubuntu. - -## Download and install - -```bash -wget https://github.com/b2ihealthcare/snow-owl/releases/download//snow-owl-oss-.deb -wget https://github.com/b2ihealthcare/snow-owl/releases/download//snow-owl-oss-.deb.sha512 -shasum -a 512 -c snow-owl-oss-.deb.sha512 # Compares the SHA of the downloaded Debian package and the published checksum, which should output `snow-owl-oss-.deb: OK`. -sudo dpkg -i snow-owl-oss-.deb -``` - -## Running Snow Owl with SysV init - -Use the update-rc.d command to configure Snow Owl to start automatically when the system boots up: - -```bash -sudo update-rc.d snowowl defaults 95 10 -``` - -Snow Owl can be started and stopped using the service command: - -```bash -sudo -i service snowowl start -sudo -i service snowowl stop -``` - -If Snow Owl fails to start for any reason, it will print the reason for failure to STDOUT. Log files can be found in `/var/log/snowowl/`. - -## Running Snow Owl with systemd - -To configure Snow Owl to start automatically when the system boots up, run the following commands: - -```bash -sudo /bin/systemctl daemon-reload -sudo /bin/systemctl enable snowowl.service -``` - -Snow Owl can be started and stopped as follows: - -```bash -sudo systemctl start snowowl.service -sudo systemctl stop snowowl.service -``` - -These commands provide no feedback as to whether Snow Owl was started successfully or not. Instead, this information will be written in the log files located in `/var/log/snowowl/`. - -## Checking that Snow Owl is running - -You can test that your Snow Owl instance is running by sending an HTTP request to: - -```bash -curl http://localhost:8080/snowowl/admin/info -``` - -which should give you a response something like this: - -```json -{ - "version": "7.2.0", - "description": "You Know, for Terminologies", - "repositories": { - "items": [ - { - "id": "snomedStore", - "health": "GREEN" - } - ] - } -} -``` - -## Configuring Snow Owl - -Snow Owl defaults to using `/etc/snowowl` for runtime configuration. The ownership of this directory and all files in this directory are set to `root:snowowl` on package installation and the directory has the `setgid` flag set so that any files and subdirectories created under `/etc/snowowl` are created with this ownership as well (e.g., if a keystore is created using the keystore tool). It is expected that this be maintained so that the Snow Owl process can read the files under this directory via the group permissions. - -Snow Owl loads its configuration from the `/etc/snowowl/snowowl.yml` file by default. The format of this config file is explained in [Configuring Snow Owl](../configure/index.md). - -{% hint style="info" %} -NOTE: Distributions that use `systemd` require that system resource limits be configured via `systemd` rather than via the `/etc/sysconfig/snowowl` file. -{% endhint %} - -## Directory layout of Debian package - -The Debian package places config files, logs, and the data directory in the appropriate locations for a Debian-based system: - -| Type | Description | Default Location | Setting | -| ------------- | ----------------------- | ----------------- | ------- | -| home | Snow Owl home directory or `$SO_HOME` | `/usr/share/snowowl` || -| bin | Binary scripts including startup/shutdown to start/stop the instance | `/usr/share/snowowl/bin` || -| conf | Configuration files including `snowowl.yml` | `/etc/snowowl` | [SO_PATH_CONF](../configure/index.md#config-files-location) | -| data | The location of the data files and resources. | /var/lib/snowowl | path.data | -| logs | Log files location. | /var/log/snowowl || - -## Next steps - -You now have a test Snow Owl environment set up. Before you start serious development or go into production with Snow Owl, you must do some additional setup: - -* Learn how to [configure Snow Owl](../configure/index.md). -* Configure [important Snow Owl settings](../configure/important-settings.md). -* Configure [important system settings](../configure/). diff --git a/docs/setup/install/docker.md b/docs/setup/install/docker.md deleted file mode 100644 index 0435ea3c00e..00000000000 --- a/docs/setup/install/docker.md +++ /dev/null @@ -1,142 +0,0 @@ -# Install Snow Owl with Docker - -Snow Owl is also available as Docker images. The images use [centos:7](https://hub.docker.com/_/centos/) as the base image. - -A list of all published Docker images and tags is available at [Docker Hub](https://hub.docker.com/r/b2ihealthcare/snow-owl-oss/). - -These images are free to use under the Apache 2.0 license. They contain open source features only. - -## Pulling the image - -Obtaining Snow Owl for Docker is as simple as issuing a `docker pull` command against the Docker Hub registry. - -```bash -docker pull snow-owl-oss:latest -``` - -## Running Snow Owl from the command line - -### Development mode - -Snow Owl can be quickly started for development or testing use with the following command: - -```bash -docker run -p 8080:8080 snow-owl-oss:latest -``` - -### Production mode - -{% hint style="info" %} -The `vm.max_map_count` kernel setting needs to be set to at least `262144` permanently in `/etc/sysctl.conf` for production use. -To apply the setting on a live system type: `sysctl -w vm.max_map_count=262144` -{% endhint %} - -The following example brings up Snow Owl instance with its dedicated Elasticsearch node. -To bring up the cluster, use the [docker-compose.yml](https://github.com/b2ihealthcare/snow-owl/blob/8.x/docker/docker-compose.yml) and just type: - -```bash -docker-compose up -``` - -{% hint style="info" %} -`docker-compose` is not pre-installed with Docker on Linux. Instructions for installing it can be found on the [Docker Compose webpage](https://docs.docker.com/compose/install/#install-using-pip). -{% endhint %} - -The node `snowowl` listens on `localhost:8080` while it talks to the `elasticsearch` node over a Docker network. - -To stop the cluster, type `docker-compose down`. Data volumes/mounts will persist, so it's possible to start the stack again with the same data using -docker-compose up`. - -## Configuring Snow Owl with Docker - -Snow Owl loads its configuration from files under `/usr/share/snowowl/config/`. -These configuration files are documented in the [Configure Snow Owl](../configure/index.md) pages. - -The image offers several methods for configuring Snow Owl settings with the -conventional approach being to provide customized files, that is to say, -`snowowl.yml`. It's also possible to use environment variables to set -options: - -* A. Bind-mounted configuration -Create your custom config file and mount this over the image's corresponding file. -For example, bind-mounting a `custom_snowowl.yml` with `docker run` can be -accomplished with the parameter: - -```bash --v full_path_to/custom_snowowl.yml:/usr/share/snowowl/configuration/snowowl.yml -``` - -{% hint style="warn" %} -The container **runs Snow Owl as user `snowowl` using uid:gid `1000:1000`**. -Bind mounted host directories and files, such as `custom_snowowl.yml` above, -**need to be accessible by this user**. For the mounted data and log dirs, -such as `/usr/share/snowowl/resources`, write access is required as well. -{% endhint %} - -* B. Customized image -In some environments, it may make more sense to prepare a custom image containing -your configuration. A `Dockerfile` to achieve this may be as simple as: - -```bash -FROM snow-owl-oss:{version} -COPY --chown=snowowl:snowowl snowowl.yml /usr/share/snowowl/configuration/ -``` - -You could then build and try the image with something like: - -```bash -docker build --tag=snow-owl-oss-custom . -docker run -ti -v /usr/share/snowowl/resources snow-owl-oss-custom -``` - -## Notes for production use and defaults - -We have collected a number of best practices for production use. -Any Docker parameters mentioned below assume the use of `docker run`. - -By default, Snow Owl runs inside the container as user `snowowl` using uid:gid `1000:1000`. - -* If you are bind-mounting a local directory or file, ensure it is readable by -this user, while the <> additionally require -write access. A good strategy is to grant group access to gid `1000` or `0` for -the local directory. As an example, to prepare a local directory for storing -data through a bind-mount: - -``` - mkdir sodatadir - chmod g+rwx sodatadir - chgrp 1000 sodatadir -``` - -* It is important to ensure increased ulimits for `nofile` -and `nproc` are available for the Snow Owl containers. -Verify the [init system](https://github.com/moby/moby/tree/ea4d1243953e6b652082305a9c3cda8656edab26/contrib/init) -for the Docker daemon is already setting those to acceptable values and, if -needed, adjust them in the Daemon, or override them per container, for example -using `docker run`: - -``` - --ulimit nofile=65535:65535 -``` - -NOTE: One way of checking the Docker daemon defaults for the aforementioned -ulimits is by running: - -``` - docker run --rm centos:7 /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su' -``` - -* Swapping needs to be disabled for performance and stability. This can be -achieved through any of the methods mentioned in the [system settings](../configure/system-settings.md). - -* The image [exposes](https://docs.docker.com/engine/reference/builder/#/expose) -TCP ports 8080 and 2036. - -* Use the `SO_JAVA_OPTS` environment variable to set heap size. For example, to -use 16GB use `SO_JAVA_OPTS="-Xms16g -Xmx16g"` with `docker run`. - -* Pin your deployments to a specific version of the Snow Owl OSS Docker image. For -example, `snow-owl-oss:7.2.0`. - -* Consider centralizing your logs by using a different https://docs.docker.com/engine/admin/logging/overview/[logging driver]. Also note -that the default json-file logging driver is not ideally suited for production use. \ No newline at end of file diff --git a/docs/setup/install/index.md b/docs/setup/install/index.md deleted file mode 100644 index 385c983c054..00000000000 --- a/docs/setup/install/index.md +++ /dev/null @@ -1,10 +0,0 @@ -# Installing Snow Owl - -Snow Owl is provided in the following package formats: - -| Package | Description | -| ---------------- | ----------------------------------------- | -| zip/tar.gz | The `zip` and `tar.gz` packages are suitable for installation on any system and are the easiest choice for getting started with Snow Owl on most systems.
[Install Snow Owl with `tar.gz` or `zip`](tarzip.md) | -| rpm | The `rpm` package is suitable for installation on Red Hat, Centos, SLES, OpenSuSE and other RPM-based systems. RPMs may be downloaded from the Downloads section.
[Install Snow Owl with RPM](rpm.md) | -| deb | The `deb` package is suitable for Debian, Ubuntu, and other Debian-based systems. Debian packages may be downloaded from the Downloads section.
[Install Snow Owl with Debian Package](debian.md) | -| docker | Images are available for running Snow Owl as Docker containers. They may be downloaded from the official Docker Hub Registry.
[Install Snow Owl with Docker](docker.md) | diff --git a/docs/setup/install/rpm.md b/docs/setup/install/rpm.md deleted file mode 100644 index 90f72349ea5..00000000000 --- a/docs/setup/install/rpm.md +++ /dev/null @@ -1,106 +0,0 @@ -# Install Snow Owl with RPM - -The RPM for Snow Owl can be downloaded from the Downloads section. It can be used to install Snow Owl on any RPM-based system such as OpenSuSE, SLES, Centos, Red Hat, and Oracle Enterprise. - -{% hint style="info" %} -RPM install is not supported on distributions with old versions of RPM, such as SLES 11 and CentOS 5. Please see [Install Snow Owl with .zip or .tar.gz](./tarzip.md) instead. -{% endhint %} - -## Download and install - -```bash -wget https://github.com/b2ihealthcare/snow-owl/releases/download//snow-owl-oss-.rpm -wget https://github.com/b2ihealthcare/snow-owl/releases/download//snow-owl-oss-.rpm.sha512 -shasum -a 512 -c snow-owl-oss-.rpm.sha512 # Compares the SHA of the downloaded RPM and the published checksum, which should output `snow-owl-oss-.rpm: OK`. -sudo rpm --install snow-owl-oss-.rpm -``` - -{% hint style="info" %} -On systemd-based distributions, the installation scripts will attempt to set kernel parameters (e.g., `vm.max_map_count`); you can skip this by masking the systemd-sysctl.service unit. -{% endhint %} - -## Running Snow Owl with SysV init - -Use the chkconfig command to configure Snow Owl to start automatically when the system boots up: - -``` -sudo chkconfig --add snowowl -``` - -Snow Owl can be started and stopped using the service command: - -``` -sudo -i service snowowl start -sudo -i service snowowl stop -``` - -If Snow Owl fails to start for any reason, it will print the reason for failure to STDOUT. Log files can be found in `/var/log/snowowl/`. - -## Running Snow Owl with systemd - -To configure Snow Owl to start automatically when the system boots up, run the following commands: - -```bash -sudo /bin/systemctl daemon-reload -sudo /bin/systemctl enable snowowl.service -``` - -Snow Owl can be started and stopped as follows: - -```bash -sudo systemctl start snowowl.service -sudo systemctl stop snowowl.service -``` - -These commands provide no feedback as to whether Snow Owl was started successfully or not. Instead, this information will be written in the log files located in `/var/log/snowowl/`. - -## Checking that Snow Owl is running - -You can test that your Snow Owl instance is running by sending an HTTP request to: - -```bash -curl http://localhost:8080/snowowl/admin/info -``` - -which should give you a response something like this: - -```json -{ - "version": "7.2.0", - "description": "You Know, for Terminologies", - "repositories": { - "items": [ - { - "id": "snomedStore", - "health": "GREEN" - } - ] - } -} -``` - -## Configuring Snow Owl - -Snow Owl defaults to using `/etc/snowowl` for runtime configuration. The ownership of this directory and all files in this directory are set to `root:snowowl` on package installation and the directory has the `setgid` flag set so that any files and subdirectories created under `/etc/snowowl` are created with this ownership as well (e.g., if a keystore is created using the keystore tool). It is expected that this be maintained so that the Snow Owl process can read the files under this directory via the group permissions. - -Snow Owl loads its configuration from the `/etc/snowowl/snowowl.yml` file by default. The format of this config file is explained in [Configuring Snow Owl](../configure/index.md). - -## Directory layout of RPM - -The RPM places config files, logs, and the data directory in the appropriate locations for an RPM-based system: - -| Type | Description | Default Location | Setting | -| ------------- | ----------------------- | ----------------- | ------- | -| home | Snow Owl home directory or `$SO_HOME` | `/usr/share/snowowl` || -| bin | Binary scripts including startup/shutdown to start/stop the instance | `/usr/share/snowowl/bin` || -| conf | Configuration files including `snowowl.yml` | `/etc/snowowl` | [SO_PATH_CONF](../configure/index.md#config-files-location) | -| data | The location of the data files and resources. | /var/lib/snowowl | path.data | -| logs | Log files location. | /var/log/snowowl || - -## Next steps - -You now have a test Snow Owl environment set up. Before you start serious development or go into production with Snow Owl, you must do some additional setup: - -* Learn how to [configure Snow Owl](../configure/index.md). -* Configure [important Snow Owl settings](../configure/important-settings.md). -* Configure [important system settings](../configure/). diff --git a/docs/setup/install/tarzip.md b/docs/setup/install/tarzip.md deleted file mode 100644 index 59468167144..00000000000 --- a/docs/setup/install/tarzip.md +++ /dev/null @@ -1,116 +0,0 @@ -# Install Snow Owl with .zip or .tar.gz - -Snow Owl is provided as a `.zip` and as a `.tar.gz` package. These packages can be used to install Snow Owl on any system and are the easiest package format to use when trying out Snow Owl. - -The latest stable version of Snow Owl can be found on the [Snow Owl Releases](https://github.com/b2ihealthcare/snow-owl/releases) page. - -{% hint style="info" %} -Snow Owl requires Java 11 or newer version. Use the official Oracle distribution or an open-source distribution such as OpenJDK. -{% endhint %} - -## Download and install the `zip` package - -The `.zip` archive for Snow Owl can be downloaded and installed as follows: - -```bash -wget https://github.com/b2ihealthcare/snow-owl/releases/download//snow-owl-oss-.zip -wget https://github.com/b2ihealthcare/snow-owl/releases/download//snow-owl-oss-.zip.sha512 -shasum -a 512 -c snowowl-oss-.zip.sha512 # compares the SHA of the downloaded archive, should output: `snowowl-oss-.zip: OK.` -unzip snowowl-oss-.zip -cd snowowl-oss-/ # This directory is known as `$SO_HOME` -``` - -## Download and install the `.tar.gz` package - -The `.tar.gz` archive for Snow Owl can be downloaded and installed as follows: - -```bash -wget https://github.com/b2ihealthcare/snow-owl/releases/download//snow-owl-oss-.tar.gz -wget https://github.com/b2ihealthcare/snow-owl/releases/download//snow-owl-oss-.tar.gz.sha512 -shasum -a 512 -c snowowl-oss-.tar.gz.sha512 # compares the SHA of the downloaded archive, should output: `snowowl-oss-.tar.gz: OK.` -tar -xzf snowowl-oss-.tar.gz -cd snowowl-oss-/ # This directory is known as `$SO_HOME` -``` - -## Running Snow Owl from the command line - -Snow Owl can be started from the command line as follows: - -```bash -./bin/startup -``` - -By default, Snow Owl runs in the foreground, prints its logs to the standard output (stdout), and can be stopped by pressing Ctrl-C. - -{% hint style="info" %} -All scripts packaged with Snow Owl assume that Bash is available at /bin/bash. As such, Bash should be available at this path either directly or via a symbolic link. -{% endhint %} - -## Checking that Snow Owl is running - -You can test that your instance is running by sending an HTTP request to Snow Owl's status endpoint: - -```bash -curl http://localhost:8080/snowowl/admin/info -``` - -which should give you a response like this: - -```json -{ - "version": "7.0.0", - "description": "You Know, for Terminologies", - "repositories": { - "items": [ - { - "id": "snomedStore", - "health": "GREEN" - } - ] - } -} -``` - -## Running in the background - -You can send the Snow Owl process to the background using the combination of `nohup` and the `&` character: - -```bash -nohup ./bin/startup > /dev/null & -``` - -Log messages can be found in the `$SO_HOME/serviceability/logs/` directory. - -To shut down Snow Owl, you can kill the process ID directly: - -```bash -kill -``` - -or using the provided shutdown script: - -```bash -./bin/shutdown -``` - -## Directory layout of `.zip` and `.tar.gz` archives: - -The `.zip` and `.tar.gz` packages are entirely self-contained. All files and directories are, by default, contained within `$SO_HOME` — the directory created when unpacking the archive. - -This is very convenient because you don’t have to create any directories to start using Snow Owl, and uninstalling Snow Owl is as easy as removing the `$SO_HOME` directory. However, it is advisable to change the default locations of the config directory, the data directory, and the logs directory so that you do not delete important data later on. - -| Type | Description | Default Location | Setting | -| ------------- | ----------------------- | ----------------- | ------- | -| home | Snow Owl home directory or `$SO_HOME` | Directory created by unpacking the archive || -| bin | Binary scripts including startup/shutdown to start/stop the instance | $SO_HOME/bin || -| conf | Configuration files including `snowowl.yml` | $SO_HOME/configuration | [SO_PATH_CONF](../configure/index.md#config-files-location) | -| data | The location of the data files and resources. | $SO_HOME/resources | path.data | -| logs | Log files location. | $SO_HOME/serviceability/logs || - -## Next steps - -You now have a test Snow Owl environment set up. Before you start serious development or go into production with Snow Owl, you must do some additional setup: - -* Learn how to [configure Snow Owl](../configure/index.md). -* Configure [important Snow Owl settings](../configure/important-settings.md). -* Configure [important system settings](../configure/). \ No newline at end of file diff --git a/docs/setup/monitoring.md b/docs/setup/monitoring.md deleted file mode 100644 index d0caf6913ab..00000000000 --- a/docs/setup/monitoring.md +++ /dev/null @@ -1,3 +0,0 @@ -# Configure monitoring - -Coming soon! \ No newline at end of file diff --git a/docs/setup/reference.md b/docs/setup/reference.md deleted file mode 100644 index f3140a4d02a..00000000000 --- a/docs/setup/reference.md +++ /dev/null @@ -1 +0,0 @@ -# Configuration reference \ No newline at end of file diff --git a/docs/setup/security/file.md b/docs/setup/security/file.md deleted file mode 100644 index 91d1de37477..00000000000 --- a/docs/setup/security/file.md +++ /dev/null @@ -1,26 +0,0 @@ -# Configure a file realm - -You can manage and authenticate users with the built-in file realm. All the data about the users for the file realm is stored in the `users` file. The file is located in `SO_PATH_CONF` and is read on startup. - -You need to explicitly select the file realm in the `snowowl.yml` configuration file in order to use it for authentication. - -```yml -identity: - providers: - - file: - name: users -``` - -In the above configuration the file realm is using the `users` file to read your users from. -Each row in the file represents a username and password delimited by `:` character. -The passwords are BCrypt encrypted hashes. -The default `users` file comes with a default `snowowl` user with the default `snowowl` password. - -## Users Command - -To simplify file realm configuration, the Snow Owl CLI comes with a command to add a user to the file realm (`snowowl users add`). See the command help manual (`-h` option) for further details. - -## Authorization - -The file security realm does NOT support the Authorization formats at the moment. If you are interested in configuring role-based access control for your users, it is recommended to switch to the [LDAP security realm](./ldap.md). - \ No newline at end of file diff --git a/docs/setup/security/index.md b/docs/setup/security/index.md deleted file mode 100644 index ea456edd9f5..00000000000 --- a/docs/setup/security/index.md +++ /dev/null @@ -1,79 +0,0 @@ -# Configuring security in Snow Owl - -Snow Owl security features enable you to easily secure your terminology server. You can password-protect your data as well as implement more advanced security measures such as role-based access control and auditing. - -## Realms - -By default Snow Owl comes without any security features enabled and all read and write operations are unprotected. -To configure a security realm, you can choose from the following built-in identity providers: - -* [Configure a file realm](./file.md) -* [Configure an LDAP realm](./ldap.md) - -## Authentication - -After configuring at least one security realm, Snow Owl will authenticate all incoming requests to ensure that the sender of the request is allowed to access the terminology server and its contents. -To authenticate a request, the client must send an HTTP `Basic` or `Bearer` Authorization header with the request. -The value should be a user/pass pair in case of using `Basic` authentication or a [JWT](https://jwt.io/) token generated by Snow Owl if using the `Bearer` method. - -{% hint style="info" %} -NOTE: It is recommended in production environments that all communication between a client and Snow Owl is performed through a secure connection. -{% endhint %} - -Snow Owl sends an `HTTP 401 Unauthorized` response if a request needs to be authenticated. - -## Authorization - -If supported by the security realm, Snow Owl will also check whether an authenticated user is permitted to perform the requested action on a given resource. - -Within an organization, roles are created for various job functions. The permissions to perform certain operations are assigned to specific roles. Members, staff or other system users are assigned particular roles, and through those role assignments acquire the permissions needed to perform particular system functions. Since users are not assigned permissions directly, but only acquire them through their role (or roles), management of individual user rights becomes a matter of simply assigning appropriate roles to the user's account; this simplifies common operations, such as adding a user, or changing a user's department. - -### Rules - -1. Role assignment: A subject can exercise a permission only if the subject has selected or been assigned a role. -2. Permission authorization: A subject can exercise a permission only if the permission is authorized for the subject's active role. - -With rules 1 and 2, it is ensured that users can exercise only permissions for which they are authorized. - -S = Subject = A person or automated agent -R = Role = Job function or title which defines an authority level -P = Permissions = An approval of a mode of access to a resource - -### Permissions - -In Snow Owl a permission is a single value that represents both the operation the user would like to perform and the resource that is being accessed. -The format is the following: `:` - -Currently there are `7` operations supported by Snow Owl: -* `browse` - read the contents of a resource -* `edit` - write the contents of the resource, delete the resource -* `import` - import from external content and formats -* `export` - export to external content and formats -* `version` - create a version in a Code System, create a release -* `promote` - merge content from isolated branch environments to a Code System's development version -* `classify` - run classifiers and save their results - -Resources represent the content that is being accessed by a client. A resource can be anything that can be resolved to a database entry. -Currently, the following resource formats are allowed to be used in a permission: -* `` - access the entire content available in a terminology repository -* `/` - access the content available on a branch in a terminology repository -* `` - access all content of a Code System, including both the latest development and all previous releases -* `/` - access a specific release of a Code System - -There is a special `*` wild card character that can be used for both the operation and resource parts in a permission value to allow any operation to be performed on any or selected resources, or to allow certain operations to be performed on any available resources. - -Examples: -* `browse:snomedStore` - browse all SNOMED CT Code Systems and their content -* `edit:SNOMEDCT-UK-CL` - edit the `SNOMEDCT-UK-CL` Code System -* `export:SNOMEDCT-US/2019-03-01` - export the `2019-03-01` US Extension release -* `*:SNOMEDCT` - allow any operations to be performed on the `SNOMEDCT` Code System -* `browse:*` - allow read operations on all available resources -* `*:*` - administrator permission, the user can do anything with any of the available resources - - -## Configuring Authorization - -To configure authorization, please consult the security realm specific documentation: - -* [Configure a file realm](./file.md) -* [Configure an LDAP realm](./ldap.md) diff --git a/docs/setup/security/ldap.md b/docs/setup/security/ldap.md deleted file mode 100644 index 050ac8d397b..00000000000 --- a/docs/setup/security/ldap.md +++ /dev/null @@ -1,97 +0,0 @@ -# Configure an LDAP realm - -You can configure security to communicate with a Lightweight Directory Access Protocol (LDAP) server to authenticate and authorize users. - -To integrate with LDAP, you configure an `ldap` realm in the `snowowl.yml` configuration file. - -```yml -identity: - providers: - - ldap: - uri: - bindDn: cn=admin,dc=snowowl,dc=b2international,dc=com - bindDnPassword: - baseDn: dc=snowowl,dc=b2international,dc=com - roleBaseDn: {baseDn} - userFilter: (objectClass={userObjectClass}) - roleFilter: (objectClass={roleObjectClass}) - userObjectClass: inetOrgPerson - roleObjectClass: groupOfUniqueNames - userIdProperty: uid - permissionProperty: description - memberProperty: uniqueMember - usePool: false -``` - -## Configuration - -The following configuration settings are supported: - -| Configuration | Description | -|---------------|-----------------------| -| uri | The LDAP URI that points to the LDAP/AD server to connect to. | -| bindDn | The user's DN who has access to the entire `baseDn` and `roleBaseDn` and can read content from it. | -| bindDnPassword | The password of the `bindDn` user. | -| baseDn | The base directory where all entries in the entire subtree will be considered as potential matches for all searches. | -| roleBaseDn | Alternative base directory where all role entries in the entire subtree will be considered. Defaults to the `baseDn` value. | -| userFilter | The search filter to search for user entries under the configured `baseDn`. Defaults to `(objectClass={userObjectClass})`. | -| roleFilter | The search filter to search for role entries under the configured `roleBaseDn`. Defaults to `(objectClass={roleObjectClass})`. | -| userObjectClass | The user object's class to look for when searching for user entries. Defaults to `inetOrgPerson` class. | -| roleObjectClass | The role object's class to look for when searching for role entries. Defaults to `groupOfUniqueNames` class. | -| userIdProperty | The userId property to access and read for the user's unique identifier. Usually their username or email address. Defaults to `uid` property. | -| permissionProperty | A multi-valued property that is used to store permission information on a role. Defaults to the `description` property. | -| memberProperty | A multi-valued property that is used to store and retrieve user `dn`s that belong to a given role. Defaults to the `uniqueMember` property. | - -The default configuration values are selected to support both OpenLDAP and Active Directory without needing to customize the default schema that comes with their default installation. - -## Configure Authentication - -When users send their username and password with their request in the Authorization header, the LDAP security realm performs the following steps to authenticate the user: -1. Searches for a user entry in the configured `baseDn` to get the `DN` -2. Authenticates with the LDAP instance using the received `DN` and the provided password - -If any of the above-mentioned steps fails for any reason, the user is not allowed to access the terminology server's content and the server will respond with `HTTP 401 Unauthorized`. - -To configure authentication, you need to configure the `uri`, `baseDn`, `bindDn`, `bindDnPassword`, `userObjectClass` and `userIdProperty` configuration settings. - -### Adding a user - -To add a user in the LDAP realm, create an entry under the specified `baseDn` using the configured `userObjectClass` as class and the `userIdProperty` as the property where the user's username/e-mail address is configured. - -Example user entry: - -``` -dn: cn=John Doe+sn=Doe+uid=johndoe@b2international.com,dc=snowowl,dc=b2international,dc=com -objectClass: inetOrgPerson -objectClass: organizationalPerson -objectClass: person -objectClass: top -cn: John Doe -sn: Doe -uid: johndoe@b2international.com -userPassword: -``` - -## Configure Authorization - -On top of the authentication part, the LDAP realm provides configuration values to support full role-based access control and authorization. - -When a user's request is successfully authenticated with the LDAP realm, Snow Owl authorizes the request using the user's currently set roles and permissions in the configured LDAP instance. - -### Adding a role - -To add a role in the LDAP realm, create an entry under the specified `baseDn` using the configured `roleObjectClass` as class and the configured `permissionProperty` and `memberProperty` properties for permission and user mappings, respectively. - -Example read-only role: - -``` -dn: cn=Browser,dc=snowowl,dc=b2international,dc=com -objectClass: top -objectClass: groupOfUniqueNames -cn: Browser -description: browse:* -description: export:* -uniqueMember: cn=John Doe+sn=Doe+uid=johndoe@b2international.com,dc=snowowl,dc=b2international,dc=com -``` - - diff --git a/docs/setup/starting.md b/docs/setup/starting.md deleted file mode 100644 index 45c597ed714..00000000000 --- a/docs/setup/starting.md +++ /dev/null @@ -1,82 +0,0 @@ -# Starting Snow Owl - -The method for starting Snow Owl varies depending on how you installed it. - -## Archive packages (.tar.gz, .zip) - -If you installed Snow Owl with a `.tar.gz` or `zip` package, you can start Snow Owl from the command line. - -### Running Snow Owl from the command line - -Snow Owl can be started from the command line as follows: - -``` -./bin/startup -``` - -By default, Snow Owl runs in the foreground, prints some of its logs to the standard output (`stdout`), and can be stopped by pressing `Ctrl-C`. - -{% hint style="info" %} -All scripts packaged with Snow Owl assume that Bash is available at /bin/bash. As such, Bash should be available at this path either directly or via a symbolic link. -{% endhint %} - -### Running as a daemon - -To run Snow Owl as a daemon, use the following command: - -``` -nohup ./bin/startup > /dev/null & -``` - -Log messages can be found in the `$SO_HOME/serviceability/logs/` directory. - -{% hint style="info" %} -The startup scripts provided in the RPM and Debian packages take care of starting and stopping the Snow Owl process for you. -{% endhint %} - -## RPM packages - -Snow Owl is not started automatically after installation. How to start and stop Snow Owl depends on whether your system uses `SysV init` or `systemd` (used by newer distributions). You can tell which is being used by running this command: - -``` -ps -p 1 -``` - -### Running Snow Owl with SysV init - -Use the `chkconfig` command to configure Snow Owl to start automatically when the system boots up: - -``` -sudo chkconfig --add snowowl -``` - -Snow Owl can be started and stopped using the service command: - -``` -sudo -i service snowowl start -sudo -i service snowowl stop -``` - -If Snow Owl fails to start for any reason, it will print the reason for failure to STDOUT. Log files can be found in `/var/log/snowowl/`. - -### Running Snow Owl with systemd - -To configure Snow Owl to start automatically when the system boots up, run the following commands: - -``` -sudo /bin/systemctl daemon-reload -sudo /bin/systemctl enable snowowl.service -``` - -Snow Owl can be started and stopped as follows: - -``` -sudo systemctl start snowowl.service -sudo systemctl stop snowowl.service -``` - -These commands provide no feedback as to whether Snow Owl was started successfully or not. Instead, this information will be written in the log files located in `/var/log/snowowl/`. - -## Debian packages (Coming Soon) - -## Docker images (Coming Soon) \ No newline at end of file diff --git a/docs/setup/stopping.md b/docs/setup/stopping.md deleted file mode 100644 index f653bffca38..00000000000 --- a/docs/setup/stopping.md +++ /dev/null @@ -1,11 +0,0 @@ -# Stopping Snow Owl - -An orderly shutdown of Snow Owl ensures that Snow Owl has a chance to cleanup and close outstanding resources. For example, an instance that is shutdown in an orderly fashion will initiate an orderly shutdown of the embedded Elasticsearch instance, gracefully close and disconnect connections and perform other related cleanup activities. You can help ensure an orderly shutdown by properly stopping Snow Owl. - -If you’re running Snow Owl as a service, you can stop Snow Owl via the service management functionality provided by your installation. - -If you’re running Snow Owl directly, you can stop Snow Owl by sending `Ctrl-C` if you’re running Snow Owl in the console, or by invoking the provided `shutdown` script as follows: - -``` -$ ./bin/shutdown -``` \ No newline at end of file