Obsoletion

Looking up obsoleted entities

In OAK, the terms Obsolete and “deprecated” are used interchangeably.

Obsoletion is an important part of any ontology’s lifecycle. Sometimes it is necessary to obsolete an Identifier because it is no longer a good representation of a concept, or because it becomes out of scope, or it is discovered to be equivalent to an existing concept.

A good ontology will never delete an identifier, but will instead mark it as obsolete.

The way in which is to specify an entity is obsolete is fairly standard, using an owl:deprecated Annotation Assertion.

In Turtle:

MYO:123456 owl:deprecated true ;
           rdfs:label "obsolete foo" .

In OBO Format:

id: MYO:123456
name: obsolete foo
is_obsolete: true

Note the use of the Label prefixed with “obsolete” is purely a convention, the standard way to mark an entity as obsolete is to use the owl:deprecated annotation assertion.

You can query for all obsolete entities in an ontology using the obsoletes command:

$ runoak -i sqlite:obo:hp obsoletes
...
HP:0040180  obsolete Hyperkeratosis pilaris
HP:0040193  obsolete Pinealoblastoma
HP:0040199  obsolete Flat midface
...

You can also use .is_obsolete as a query term as input to other commands, e.g

$ runoak -i sqlite:obo:hp term-metadata .is_obsolete

In python, querying obsoleted entities is provided by the Basic Ontology Interface:

>>> from oaklib import get_adapter
>>> adapter = get_adapter("sqlite:obo:hp")
>>> for entity in sorted(adapter.obsoletes()):
...    print(entity)

...
HP:0040180
...
HP:0040199
...

Conventions and standards

For ontologies that are part of OBO, additional conventions apply. These conventions are not yet fully standardized within OMO:

obsolete entities should not be in the signature of any logical axiom

  • note that some older ontologies include obsolete classes as a subclass of an ObsoleteClass node

  • this is not treated in any special way in OAK

obsolete entities should be accompanied by metadata that provides additional context for humans and machines

  • a term replaced by annotation indicates where an automatic replacement can be made

  • a consider annotation indicates potential replacements that should be manually evaluated

In OAK, this can be retrieved like any other metadata using the entity_metadata methods from BasicOntologyInterface.

On the command line:

$ runoak -i sqlite:obo:go term-metadata GO:0000005

returns:

IAO:0000115:
- OBSOLETE. Assists in the correct assembly of ribosomes or ribosomal subunits in
  vivo, but is not a component of the assembled ribosome when performing its normal
  biological function.
id:
- GO:0000005
oio:consider:
- GO:0042254
- GO:0044183
- GO:0051082
oio:hasExactSynonym:
- ribosomal chaperone activity
oio:hasOBONamespace:
- molecular_function
oio:id:
- GO:0000005
owl:deprecated:
- 'true'
rdfs:comment:
- This term was made obsolete because it refers to a class of gene products and a
  biological process rather than a molecular function.
rdfs:label:
- obsolete ribosomal chaperone activity

To get information about all obsolete entities in an ontology, use the .is_obsolete query term:

$ runoak -i sqlite:obo:go term-metadata .is_obsolete

Merged entities

In some OBO ontologies such as GO, Mondo, CHEBI, and HPO it is common practice to merge entities. This is similar to standard obsoletion with a replaced-by term, but this is more extreme as metadata about the merged entity is lost.

In OBO format, this is handled with the alt_id tag. For example:

id: X:1
name: x1
alt_id: X:2

Here, there was previously an entity X:2, this was merged into X:1, and all metadata about X:2 is lost (although some of it may have been copied into metadata for X:1).

Note that there is no separate entry for X:2 in the OBO file.

In the OBO Format to OWL Translation, this is treated just like obsoletion with replacement, except there is no metadata about the original class (other than its deprecated axiom), and there is an additional IAO “obsoletion reason” annotation, with type “term merged”.

The above example would be translated to:

X:1 rdfs:label "x1" .
X:1 oboInOwl:hasAlternativeId X:2 .

X:2 owl:deprecated true .
X:2 IAO:0100001 X:1 .
X:2 IAO:0000231 IAO:0000227 .

OAK uses the underlying OWL model as the standard, so from OAK’s perspective, the structure of merged terms and terms that have been obsoleted with replacement is this is largely similar.

If you run:

$ runoak -i sqlite:obo:hp obsoletes

It will show all deprecated IDs, regardless of whether they were merged or not (i.e alt_ids from OBO format are included). Note that merged entities will show “None” for the label.

If you wish to exclude merged IDs (i.e. the equivalent of OBO Format stanzas that have an is_obsolete: true) then pass --no-include-merged to the command:

$ runoak -i sqlite:obo:hp obsoletes --no-include-merged

Further Reading