Logical Definitions

Logical Definitions are special kinds of Axioms that define a term in terms of other terms, in a way that is computable. OAK provides ways of operating structurally on logical definitions. Logical definitions may also be used by Reasoners to infer Entailed axioms.

Typically, logical definitions are not directly used by consumers of ontologies, so this section can be skipped by many OAK users. However, if you are interested in generating, analyzing, summarizing, or other kinds of operations on logical definitions, this section is intended to provide an overview of the basic concepts.

Logical Definitions in OWL

In OWL, logical definitions are represented using the EquivalentClasses axiom. But note that not every equivalence axioms is a logical definition, according to how we use the term in OAK. For example, an equivalence axiom connects two named classes doesn’t really function to define either class, as this would be circular.

For purposes here, we consider any equivalence axiom between a named class on the left hand side and an anonymous class expression on the right hand side to be a logical definition.

These equivalence axioms can be viewed in ontology browsers such as OLS. For example, the Uberon [fingernail](http://purl.obolibrary.org/obo/UBERON_0009565) class, has an equivalence axiom to the expression:

Equivalent to
    (nail and part of (RO) some manual digit)

Genus-differentia form logical definitions

OAK includes dedicated functionality for logical definitions that follow genus-differentia form. These are sometimes known as Aristotelian definitions. A genus-differentia definition takes the form:

a C is a G that D

where C is the defined class, G is the genus, and D is the differentia or differentiating characteristics. The differentiating characteristics are typically a list of Predicate and “Filler” class pairs.

For example:

a fingernail is a nail that is part of a finger

Here we are defining a fingernail (defined class) in terms of a specialization of a parent class (nail, the genus) based on a differentiating characteristics (differentia) based on parthood (the predicate) and a specific “filler” (finger).

This seems trivial but in fact these kinds of definitions – when provided in computable form – can be used to automate a large amount of ontology development. And they can be useful for queries over an ontology too.

It is generally considered good practice for textual definitions to be consistent with the computable genus-differentia form.

The Obo Graphs Model

The OBO Graphs data model includes a data structure / class for representing logical definitions in genus-differentia form. It limits the differentiae to be a set of existential restrictions, with no nesting.

Currently most operations in OAK that deal with logical definitions expect them to be in this form. This can sometimes be limiting if you wish to operate over more complicated OWL axioms. We may provide support for this in the future, but for now the simple form provided in the OBO Graphs data model works for a large number of ontologies. The simple form is often recommended because mistakes are far more common when more complicated structures are used.

Querying for logical definitions in OAK

$ runoak -i sqlite:obo:uberon logical-definitions .desc//p=i nail

By default, results are returned in YAML:

definedClassId: UBERON:0009565
genusIds:
- UBERON:0001705
restrictions:
- fillerId: UBERON:0002389
  propertyId: BFO:0000050
...

You can specify -O csv to get it in tabular form:

uberon nail logical definitions

definedClassId

definedClassId_label

genusIds

genusIds_label

restrictions

restrictionsPropertyIds

restrictionsPropertyIds_label

restrictionsFillerIds

restrictionsFillerIds_label

UBERON:0009565

nail of manual digit

UBERON:0001705

nail

BFO:0000050=UBERON:0002389

BFO:0000050

part of

UBERON:0002389

manual digit

UBERON:0009567

nail of pedal digit

UBERON:0001705

nail

BFO:0000050=UBERON:0001466

BFO:0000050

part of

UBERON:0001466

pedal digit

UBERON:0011273

nail of manual digit 1

UBERON:0001705

nail

BFO:0000050=UBERON:0001463

BFO:0000050

part of

UBERON:0001463

manual digit 1

UBERON:0011274

nail of manual digit 2

UBERON:0001705

nail

BFO:0000050=UBERON:0003622

BFO:0000050

part of

UBERON:0003622

manual digit 2

UBERON:0011275

nail of manual digit 3

UBERON:0001705

nail

BFO:0000050=UBERON:0003623

BFO:0000050

part of

UBERON:0003623

manual digit 3

UBERON:0011276

nail of manual digit 4

UBERON:0001705

nail

BFO:0000050=UBERON:0003624

BFO:0000050

part of

UBERON:0003624

manual digit 4

UBERON:0011277

nail of manual digit 5

UBERON:0001705

nail

BFO:0000050=UBERON:0003625

BFO:0000050

part of

UBERON:0003625

manual digit 5

UBERON:0011278

nail of pedal digit 1

UBERON:0001705

nail

BFO:0000050=UBERON:0003631

BFO:0000050

part of

UBERON:0003631

pedal digit 1

UBERON:0011279

nail of pedal digit 2

UBERON:0001705

nail

BFO:0000050=UBERON:0003632

BFO:0000050

part of

UBERON:0003632

pedal digit 2

UBERON:0011280

nail of pedal digit 3

UBERON:0001705

nail

BFO:0000050=UBERON:0003633

BFO:0000050

part of

UBERON:0003633

pedal digit 3

UBERON:0011281

nail of pedal digit 4

UBERON:0001705

nail

BFO:0000050=UBERON:0003634

BFO:0000050

part of

UBERON:0003634

pedal digit 4

UBERON:0011282

nail of pedal digit 5

UBERON:0001705

nail

BFO:0000050=UBERON:0003635

BFO:0000050

part of

UBERON:0003635

pedal digit 5

The command has a number of options for transforming this to a matrix, customizing where rows, columns, and values with be defined classes, genus terms, predicates, or fillers.

OBO Format also provides a compact way of showing logical definitions, these can be seen in OAK using the -O obo option:

$ runoak -i sqlite:obo:uberon logical-definitions .desc//p=i nail -O obo
[Term]
id: UBERON:0009565 ! nail of manual digit
intersection_of: UBERON:0001705 ! nail
intersection_of: BFO:0000050 UBERON:0002389 ! manual digit

[Term]
id: UBERON:0009567 ! nail of pedal digit
intersection_of: UBERON:0001705 ! nail
intersection_of: BFO:0000050 UBERON:0001466 ! pedal digit

Reasoning using logical definitions

Currently OAK does not support classification-style reasoning. If you need this, we recommend doing this ahead of time using a tool like ROBOT.

Logical definitions and design patterns

Creating logical definitions by hand can be time consuming and error prone. Many groups choose to do this via a templating system such as:

  • ROBOT templates

  • DOSDPs

  • OTTR templates

  • LinkML-OWL

Currently OAK does not support generating logical definition axioms or any other OWL axioms from templates, but it might in the future

Generating logical definitions

Sometimes it can be useful to generate logical definitions using heuristic methods such as lexical pattern matching. In general these generated definitions should be reviewed by experienced ontology developers before being added, but they can be useful to both get a sense of missing definitions or as an aid to manual definition creation.

Some OAK commands have a generate counterpart; above we saw the logical-definitions command which is for looking up existing logical definitions. The generate-logical-definitions counterpart can be used for generating logical definitions based on specified lexical patterns.

At this time, this command is experimental, and the flags may change.

Analyzing logical definitions

OAK will soon provide commands for analyzing logical definitions, in particular to determine consistency of lattice population.

Validating logical definitions

The validate-definitions command is used for validating text definitions - one aspect of this is checking for consistency between text and logical definitions.

Further reading