From 21f200bcf981d3a84ede7b6aa723e0a933e9c018 Mon Sep 17 00:00:00 2001 From: Giorgos Apostolopoulos Date: Thu, 4 Jun 2020 12:32:28 +0300 Subject: [PATCH 1/6] Create data documentation md file --- docs/data-model.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 docs/data-model.md diff --git a/docs/data-model.md b/docs/data-model.md new file mode 100644 index 0000000..0f59be4 --- /dev/null +++ b/docs/data-model.md @@ -0,0 +1,78 @@ +# Data model description and trait status explanation + +- `traits` (id, trait_name, current_mapping[foreign_key], status[computed_key], number_of_source_records, timestamp_added, timestamp_updated) + +The master status is meant to reflect the state of the mapping and provide insight as to what should be the next action. It can contain all the possible trait statuses, as well as `unmapped` and in `in_review` statuses. It is never changed explicitly and is always computed based on: +(1) the `is_reviewed` status of the current_mapping and on (2) the status of the ontology term the current_mapping is pointing to. + +- `users` (id, name, email, role[enum]) + +- `mappings` (id, trait_id [foreign_key], ontology_term[foreign_key], curator [foreign_key], is_reviewed[computed_boolean], timestamp_mapped) + +The `is_reviewed` field status is computed based on the reviews table. +Important consideration to note is that mappings are not unique in regard to (trait_id, ontology_term) pair. It is possible that a mapping from a certain trait to a certain ontology term is proposed multiple times in the history of the trait. These are stored in the database as separate entities for historical purposes, and displayed in the trait history. + +- `ontology_terms`:(id, curie, uri, label, status, description, cross_refs) + +The `uri` field represents the complete URI, e. g. http://www.ebi.ac.uk/efo/EFO_0000249, while `term` stores the corresponding CURIE (compact URI), in this case EFO:0000249. Note that while URL uses an underscore, CURIE uses a colon to separate namespace and an identifier. Both the URI and the CURIE can be obtained through the OLS query. +A note to make, is that the `description` and `cross_refs` fields only apply to new term suggestions created via our web app. Other terms will have those fields empty. + +The ontology term status can be either `current`, `obsolete`, `deleted`, `needs_import`, `needs_creation`, `awaiting_import`, `awaiting_creation`. This status is automatically computed, except for moving out of the “awaiting_creation” status, which requires a manual check. + +- `mapping_suggestions` (id, trait_id [foreign_key], ontology_id [foreign_key], made_by[foreign_key], timestamp) + +- `reviews` (id, mapping_id [foreign_key], reviewer [foreign_key]) + +- `comments` (id, trait_id [foreign_key], author[foreign_key], date, body) + +Comments apply to a trait in general, not to its specific state or the mappings. Essentially this is just free text displayed inline with the status and mapping changes. + +## Trait statuses and their transitions + +| Action | Ontology term status | Mapping review status
(computed based
on reviews table) | Trait stats - master
(computed based on
the previous two) | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------- | +| **Case 1. Curator chooses an existing term from EFO** | current | not_reviewed | awaiting review | +| A necessary number of reviews is accumulated | current | reviewed | current | +| | | | | +| **Case 2. Curator chooses an existing term which is _not_ in EFO (needs import)** | needs_import | not_reviewed | awaiting_review | +| A necessary number of reviews is accumulated | needs_import | reviewed | needs import | +| A batch PR is submitted for this and other terms (for import and creation) | awaiting_import | reviewed | awaiting_import | +| A term import is completed — the new ontology term status is caught automatically during a periodic OLS status refresh.
After import the same term will now be "current" | current | reviewed | current | +| | | | | +| **Case 3. Curator chooses a new term which is not in _any_ ontology (needs creation)** | needs_creation | not_reviewed | awaiting_review | +| necessary number of reviews is accumulated | needs_creation | reviewed | needs_creation | +| A batch PR is submitted for this and other terms (for import and creation) | awaiting_creation | reviewed | awaiting_creation | +| After the PR is closed and new terms are created, the curator
manually selects a new term | current | not_reviewed | awaiting_review | +| A necessary number of reviews for the newly created term is accumulated | current | reviewed | current | + +### Diagram: + +[![](https://i.imgur.com/tUBBipu.png) + +Mermaid iagram source code : + +`stateDiagram-v2` + +`unmapped --> in_review:Mapped to newly suggested term` + +`unmapped --> in_review:Mapped to a term in EFO` + +`unmapped --> in_review: Mapped to a term in another ontology` + +`in_review --> needs_creation:Successfully reviewed new term` + +`in_review --> current: Successfully reviewed term in EFO` + +`in_review --> needs_import:Successfully reviewed term from
another ontology` + +`needs_creation --> awaiting_creation: Submitted in PR` + +`note right of awaiting_creation : Newly created terms
cannot be automatically
picked up. To map them,
one has to manually
choose them` `once they
are in EFO` + +`needs_import --> awaiting_import: Submitted in PR` + +`awaiting_import --> current: Picked up in periodic OLS query` + +`current --> obsolete: Found obsolete in periodic OLS query` + +`current --> deleted: Not found in periodic OLS query` From 7b1d5d87971fe74d15dac6025807b8b19003ca3b Mon Sep 17 00:00:00 2001 From: Giorgos Apostolopoulos Date: Thu, 4 Jun 2020 17:33:05 +0300 Subject: [PATCH 2/6] Fix typos in data-model.md --- docs/data-model.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/data-model.md b/docs/data-model.md index 0f59be4..56933ec 100644 --- a/docs/data-model.md +++ b/docs/data-model.md @@ -29,7 +29,7 @@ Comments apply to a trait in general, not to its specific state or the mappings. ## Trait statuses and their transitions -| Action | Ontology term status | Mapping review status
(computed based
on reviews table) | Trait stats - master
(computed based on
the previous two) | +| Action | Ontology term status | Mapping review status
(computed based
on reviews table) | Trait status - master
(computed based on
the previous two) | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------- | | **Case 1. Curator chooses an existing term from EFO** | current | not_reviewed | awaiting review | | A necessary number of reviews is accumulated | current | reviewed | current | @@ -47,9 +47,9 @@ Comments apply to a trait in general, not to its specific state or the mappings. ### Diagram: -[![](https://i.imgur.com/tUBBipu.png) +![](https://i.imgur.com/tUBBipu.png) -Mermaid iagram source code : +Mermaid diagram source code : `stateDiagram-v2` From 2248fdff4a639cf82bec231c6fb3e831033593da Mon Sep 17 00:00:00 2001 From: Giorgos Apostolopoulos Date: Sun, 7 Jun 2020 12:22:00 +0300 Subject: [PATCH 3/6] Add mermaid diagram source code and image to docs folder --- docs/statuses_diagram.mmd | 25 +++++++++++++++++++++++++ docs/statuses_diagram.png | Bin 0 -> 81828 bytes 2 files changed, 25 insertions(+) create mode 100644 docs/statuses_diagram.mmd create mode 100644 docs/statuses_diagram.png diff --git a/docs/statuses_diagram.mmd b/docs/statuses_diagram.mmd new file mode 100644 index 0000000..b60f597 --- /dev/null +++ b/docs/statuses_diagram.mmd @@ -0,0 +1,25 @@ +stateDiagram-v2 + +unmapped --> in_review:Mapped to newly suggested term + +unmapped --> in_review:Mapped to a term in EFO + +unmapped --> in_review: Mapped to a term in another ontology + +in_review --> needs_creation:Successfully reviewed new term + +in_review --> current: Successfully reviewed term in EFO + +in_review --> needs_import:Successfully reviewed term from
another ontology + +needs_creation --> awaiting_creation: Submitted in PR + +note right of awaiting_creation : Newly created terms
cannot be automatically
picked up. To map them,
one has to manually
choose them` `once they
are in EFO + +needs_import --> awaiting_import: Submitted in PR + +awaiting_import --> current: Picked up in periodic OLS query + +current --> obsolete: Found obsolete in periodic OLS query + +current --> deleted: Not found in periodic OLS query \ No newline at end of file diff --git a/docs/statuses_diagram.png b/docs/statuses_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..32363418ee5d6693b5242cead708d35575be3a22 GIT binary patch literal 81828 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%0AH? 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 Date: Sun, 7 Jun 2020 12:22:23 +0300 Subject: [PATCH 4/6] Fix data model doc formatting and move mmd source code --- docs/data-model.md | 80 ++++++++++++---------------------------------- 1 file changed, 21 insertions(+), 59 deletions(-) diff --git a/docs/data-model.md b/docs/data-model.md index 56933ec..4d2c2e1 100644 --- a/docs/data-model.md +++ b/docs/data-model.md @@ -1,78 +1,40 @@ # Data model description and trait status explanation - `traits` (id, trait_name, current_mapping[foreign_key], status[computed_key], number_of_source_records, timestamp_added, timestamp_updated) - -The master status is meant to reflect the state of the mapping and provide insight as to what should be the next action. It can contain all the possible trait statuses, as well as `unmapped` and in `in_review` statuses. It is never changed explicitly and is always computed based on: + + The master status is meant to reflect the state of the mapping and provide insight as to what should be the next action. It can contain all the possible trait statuses, as well as `unmapped` and in `in_review` statuses. It is never changed explicitly and is always computed based on: (1) the `is_reviewed` status of the current_mapping and on (2) the status of the ontology term the current_mapping is pointing to. - - `users` (id, name, email, role[enum]) - - `mappings` (id, trait_id [foreign_key], ontology_term[foreign_key], curator [foreign_key], is_reviewed[computed_boolean], timestamp_mapped) - -The `is_reviewed` field status is computed based on the reviews table. + + The `is_reviewed` field status is computed based on the reviews table. Important consideration to note is that mappings are not unique in regard to (trait_id, ontology_term) pair. It is possible that a mapping from a certain trait to a certain ontology term is proposed multiple times in the history of the trait. These are stored in the database as separate entities for historical purposes, and displayed in the trait history. - - `ontology_terms`:(id, curie, uri, label, status, description, cross_refs) - -The `uri` field represents the complete URI, e. g. http://www.ebi.ac.uk/efo/EFO_0000249, while `term` stores the corresponding CURIE (compact URI), in this case EFO:0000249. Note that while URL uses an underscore, CURIE uses a colon to separate namespace and an identifier. Both the URI and the CURIE can be obtained through the OLS query. -A note to make, is that the `description` and `cross_refs` fields only apply to new term suggestions created via our web app. Other terms will have those fields empty. - -The ontology term status can be either `current`, `obsolete`, `deleted`, `needs_import`, `needs_creation`, `awaiting_import`, `awaiting_creation`. This status is automatically computed, except for moving out of the “awaiting_creation” status, which requires a manual check. - + + The `uri` field represents the complete URI, e. g. http://www.ebi.ac.uk/efo/EFO_0000249, while `term` stores the corresponding CURIE (compact URI), in this case EFO:0000249. Note that while URL uses an underscore, CURIE uses a colon to separate namespace and an identifier. Both the URI and the CURIE can be obtained through the OLS query. + + A note to make, is that the `description` and `cross_refs` fields only apply to new term suggestions created via our web app. Other terms will have those fields empty. + + The ontology term status can be either `current`, `obsolete`, `deleted`, `needs_import`, `needs_creation`, `awaiting_import`, `awaiting_creation`. This status is automatically computed, except for moving out of the “awaiting_creation” status, which requires a manual check. - `mapping_suggestions` (id, trait_id [foreign_key], ontology_id [foreign_key], made_by[foreign_key], timestamp) - - `reviews` (id, mapping_id [foreign_key], reviewer [foreign_key]) - - `comments` (id, trait_id [foreign_key], author[foreign_key], date, body) - -Comments apply to a trait in general, not to its specific state or the mappings. Essentially this is just free text displayed inline with the status and mapping changes. + + Comments apply to a trait in general, not to its specific state or the mappings. Essentially this is just free text displayed inline with the status and mapping changes. ## Trait statuses and their transitions -| Action | Ontology term status | Mapping review status
(computed based
on reviews table) | Trait status - master
(computed based on
the previous two) | +| Action | Ontology term status | Mapping review status
(computed based
on reviews table) | Trait status - master
(computed based on
the previous two) | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------- | -| **Case 1. Curator chooses an existing term from EFO** | current | not_reviewed | awaiting review | -| A necessary number of reviews is accumulated | current | reviewed | current | -| | | | | -| **Case 2. Curator chooses an existing term which is _not_ in EFO (needs import)** | needs_import | not_reviewed | awaiting_review | -| A necessary number of reviews is accumulated | needs_import | reviewed | needs import | -| A batch PR is submitted for this and other terms (for import and creation) | awaiting_import | reviewed | awaiting_import | -| A term import is completed — the new ontology term status is caught automatically during a periodic OLS status refresh.
After import the same term will now be "current" | current | reviewed | current | -| | | | | -| **Case 3. Curator chooses a new term which is not in _any_ ontology (needs creation)** | needs_creation | not_reviewed | awaiting_review | -| necessary number of reviews is accumulated | needs_creation | reviewed | needs_creation | -| A batch PR is submitted for this and other terms (for import and creation) | awaiting_creation | reviewed | awaiting_creation | -| After the PR is closed and new terms are created, the curator
manually selects a new term | current | not_reviewed | awaiting_review | -| A necessary number of reviews for the newly created term is accumulated | current | reviewed | current | +| **Case 1. Curator chooses an existing term from EFO** | current | not_reviewed | awaiting review | +| A necessary number of reviews is accumulated| current | reviewed | current | +| | | | +| **Case 2. Curator chooses an existing term which is _not_ in EFO (needs import)**| needs_import |not_reviewed | awaiting_review | +| A necessary number of reviews is accumulated | needs_import | reviewed | needs import | +| A batch PR is submitted for this and other terms (for import and creation) | awaiting_import | reviewed | awaiting_import | +| A term import is completed — the new ontology term status is caught automatically during a periodic OLS status refresh.
After import the same term will now be "current" | current | reviewed | current | +| | | | | +| **Case 3. Curator chooses a new term which is not in _any_ ontology (needs creation)** | needs_creation | not_reviewed | awaiting_review | +| A necessary number of reviews is accumulated | needs_creation | reviewed | needs_creation | +| A batch PR is submitted for this and other terms (for import and creation) | awaiting_creation | reviewed | awaiting_creation | +| After the PR is closed and new terms are created, the curator
manually selects a new term | current | not_reviewed | awaiting_review | +| A necessary number of reviews for the newly created term is accumulated | current | reviewed | current | ### Diagram: -![](https://i.imgur.com/tUBBipu.png) - -Mermaid diagram source code : - -`stateDiagram-v2` - -`unmapped --> in_review:Mapped to newly suggested term` - -`unmapped --> in_review:Mapped to a term in EFO` - -`unmapped --> in_review: Mapped to a term in another ontology` - -`in_review --> needs_creation:Successfully reviewed new term` - -`in_review --> current: Successfully reviewed term in EFO` - -`in_review --> needs_import:Successfully reviewed term from
another ontology` - -`needs_creation --> awaiting_creation: Submitted in PR` - -`note right of awaiting_creation : Newly created terms
cannot be automatically
picked up. To map them,
one has to manually
choose them` `once they
are in EFO` - -`needs_import --> awaiting_import: Submitted in PR` - -`awaiting_import --> current: Picked up in periodic OLS query` - -`current --> obsolete: Found obsolete in periodic OLS query` +![Mermaid Diagram](statuses_diagram.png "Statuses Diagram") -`current --> deleted: Not found in periodic OLS query` From 24f66219847fce3f51c490f3b24923710a2e2a94 Mon Sep 17 00:00:00 2001 From: Giorgos Apostolopoulos Date: Sun, 7 Jun 2020 12:24:14 +0300 Subject: [PATCH 5/6] Add newline at end for mmd source code --- docs/statuses_diagram.mmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/statuses_diagram.mmd b/docs/statuses_diagram.mmd index b60f597..25750b3 100644 --- a/docs/statuses_diagram.mmd +++ b/docs/statuses_diagram.mmd @@ -22,4 +22,4 @@ awaiting_import --> current: Picked up in periodic OLS query current --> obsolete: Found obsolete in periodic OLS query -current --> deleted: Not found in periodic OLS query \ No newline at end of file +current --> deleted: Not found in periodic OLS query From 26f23b4b02b75a1cf39995f46f0b646fcd62d19c Mon Sep 17 00:00:00 2001 From: Giorgos Apostolopoulos Date: Sun, 7 Jun 2020 12:25:13 +0300 Subject: [PATCH 6/6] Remove extra line from data-model.md --- docs/data-model.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/data-model.md b/docs/data-model.md index 4d2c2e1..979e9f7 100644 --- a/docs/data-model.md +++ b/docs/data-model.md @@ -37,4 +37,3 @@ Important consideration to note is that mappings are not unique in regard to (tr ### Diagram: ![Mermaid Diagram](statuses_diagram.png "Statuses Diagram") -