Transitive closure
Calculating the transitive closure: the old way
See Schema notes
The old way was to ignore the relation in the GO graph and calculate a blind transitive closure. This works fine so long as GO consists of only a few relations like is_a and part_of. However, it results in false positives when used with regulates. These are not so serious as we had previously been treating regulates as part_of anyway. However, the relation does need to be taken into account for other relations, escpecially has_part
Calculating the transitive closure: the new way
The new way will take relations and semantics of those relations into account. See [[:Category::Reasoning]]. This may more accurately be called the deductive closure
3rd party consumers of the GO will have the option of calculating the closure themselves, or using a pre-computed closure. The pre-computed closure will be available as:
- A simple tab-delimited file
- in the graph_path table in the database
Tab delimited file
This will mostly likely contain:
- subject GO ID (i.e. child)
- target GO ID (i.e. parent)
- relation ID (e.g. part_of)
- distance
graph_path table
The graph_path table is being extended to include the relation:
--- @@ graph_path.relationship_type_id --- References an entry in the term table corresponding --- to the INFERRED relation that holds between term2 and term1. --- At this time the value is always NULL - a blind transitive closure --- is calculated, ignoring the relationship_type_id in term2term. --- However, in future we want to calculate different closures for --- different relations. [See --- ] relationship_type_id integer,
foreign key (relationship_type_id) references term(id),
Using the closure
How it's calculated
Currently the blind transitive closure is calculated using perl code in go-db-perl
This code will be retired - instead we will use a reasoner; most likely the OboEdit reasoner. See the OE reasoner paper ([[:Category::Reasoning]]