obo 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +22 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/Rakefile +46 -0
- data/VERSION +1 -0
- data/lib/obo.rb +133 -0
- data/test/data/ro.obo +235 -0
- data/test/data/so_2_4_3.obo +16818 -0
- data/test/data/temp +24 -0
- data/test/data/testfile.txt +2 -0
- data/test/helper.rb +19 -0
- data/test/test_obo.rb +51 -0
- metadata +127 -0
data/.document
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
|
6
|
+
# Add dependencies to develop your gem here.
|
7
|
+
# Include everything needed to run rake, tests, features, etc.
|
8
|
+
group :development do
|
9
|
+
gem "minitest", ">= 0"
|
10
|
+
gem "yard", "~> 0.6.0"
|
11
|
+
gem "bundler", "~> 1.0.0"
|
12
|
+
gem "jeweler", "~> 1.6.0"
|
13
|
+
gem "rcov", ">= 0"
|
14
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
git (1.2.5)
|
5
|
+
jeweler (1.6.0)
|
6
|
+
bundler (~> 1.0.0)
|
7
|
+
git (>= 1.2.5)
|
8
|
+
rake
|
9
|
+
minitest (2.1.0)
|
10
|
+
rake (0.8.7)
|
11
|
+
rcov (0.9.9)
|
12
|
+
yard (0.6.8)
|
13
|
+
|
14
|
+
PLATFORMS
|
15
|
+
ruby
|
16
|
+
|
17
|
+
DEPENDENCIES
|
18
|
+
bundler (~> 1.0.0)
|
19
|
+
jeweler (~> 1.6.0)
|
20
|
+
minitest
|
21
|
+
rcov
|
22
|
+
yard (~> 0.6.0)
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 robsyme
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
= obo
|
2
|
+
|
3
|
+
Description goes here.
|
4
|
+
|
5
|
+
== Contributing to obo
|
6
|
+
|
7
|
+
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
8
|
+
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
|
9
|
+
* Fork the project
|
10
|
+
* Start a feature/bugfix branch
|
11
|
+
* Commit and push until you are happy with your contribution
|
12
|
+
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
13
|
+
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
14
|
+
|
15
|
+
== Copyright
|
16
|
+
|
17
|
+
Copyright (c) 2011 robsyme. See LICENSE.txt for
|
18
|
+
further details.
|
19
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.name = "obo"
|
18
|
+
gem.homepage = "http://github.com/robsyme/obo"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = %Q{A parser for the OBO flat file format}
|
21
|
+
gem.description = %Q{The OBO format is the text file format used by OBO-Edit, the open-source, platform-independent application for viewing and editing ontologies. The format is described here: http://www.geneontology.org/GO.format.obo-1_2.shtml}
|
22
|
+
gem.email = "rob.syme@gmail.com"
|
23
|
+
gem.authors = ["robsyme"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require 'rake/testtask'
|
29
|
+
Rake::TestTask.new(:test) do |test|
|
30
|
+
test.libs << 'lib' << 'test'
|
31
|
+
test.pattern = 'test/**/test_*.rb'
|
32
|
+
test.verbose = true
|
33
|
+
end
|
34
|
+
|
35
|
+
require 'rcov/rcovtask'
|
36
|
+
Rcov::RcovTask.new do |test|
|
37
|
+
test.libs << 'test'
|
38
|
+
test.pattern = 'test/**/test_*.rb'
|
39
|
+
test.verbose = true
|
40
|
+
test.rcov_opts << '--exclude "gems/*"'
|
41
|
+
end
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
require 'yard'
|
46
|
+
YARD::Rake::YardocTask.new
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/lib/obo.rb
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Obo
|
4
|
+
|
5
|
+
class Header
|
6
|
+
attr_reader :tagvalues
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@tagvalues = Hash.new{|h,k| h[k] = []}
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](tag)
|
13
|
+
values = @tagvalues[tag]
|
14
|
+
values.length == 1 ? values.first : values
|
15
|
+
end
|
16
|
+
|
17
|
+
def add(tag,value)
|
18
|
+
@tagvalues[tag] << value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Stanza
|
23
|
+
attr_reader :name
|
24
|
+
attr_reader :tagvalues
|
25
|
+
|
26
|
+
def initialize(name)
|
27
|
+
@name = name
|
28
|
+
@tagvalues = Hash.new{|h,k| h[k] = []}
|
29
|
+
end
|
30
|
+
|
31
|
+
def [](tag)
|
32
|
+
values = @tagvalues[tag]
|
33
|
+
case values.length
|
34
|
+
when 0
|
35
|
+
nil
|
36
|
+
when 1
|
37
|
+
values.first
|
38
|
+
else values
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def add(tag,value)
|
43
|
+
@tagvalues[tag] << case value
|
44
|
+
when 'true'
|
45
|
+
true
|
46
|
+
when 'false'
|
47
|
+
false
|
48
|
+
else value
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def method_missing(method, *args, &block)
|
53
|
+
values = self[method.to_s]
|
54
|
+
|
55
|
+
if values
|
56
|
+
return values
|
57
|
+
elsif method =~ /\?$/
|
58
|
+
self.send(method[0..-2])
|
59
|
+
else
|
60
|
+
raise NoMethodError, "No method #{method} on #{self.class}"
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
class Parser
|
68
|
+
|
69
|
+
STANZA_START = /^\[(.*?)\]/
|
70
|
+
TAG_VALUE = /^(.*?):([^!]*)/
|
71
|
+
|
72
|
+
def initialize(filename)
|
73
|
+
@header = nil
|
74
|
+
@io = File.open(filename)
|
75
|
+
end
|
76
|
+
|
77
|
+
def elements(io = @io)
|
78
|
+
Enumerator.new do |yielder|
|
79
|
+
header = Header.new
|
80
|
+
previous_line_position = io.pos
|
81
|
+
line = lines.next
|
82
|
+
until line.is_a? Stanza
|
83
|
+
header.add(*line)
|
84
|
+
previous_line_position = io.pos
|
85
|
+
line = lines.next
|
86
|
+
end
|
87
|
+
yielder << header
|
88
|
+
io.pos = previous_line_position
|
89
|
+
|
90
|
+
stanzas.each{|stanza| yielder << stanza}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def stanzas
|
95
|
+
Enumerator.new do |yielder|
|
96
|
+
stanza = lines.first{|line| line.is_a? Stanza}
|
97
|
+
|
98
|
+
lines.each do |line|
|
99
|
+
case line
|
100
|
+
when Array
|
101
|
+
stanza.add(*line)
|
102
|
+
when Stanza
|
103
|
+
yielder << stanza
|
104
|
+
stanza = line
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def rewind(io = @io)
|
112
|
+
io.pos = 0
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
# Yields lines that are either Stanza name or tag-value pairs
|
118
|
+
def lines(io = @io)
|
119
|
+
Enumerator.new do |yielder|
|
120
|
+
while line = io.gets
|
121
|
+
case line.strip
|
122
|
+
when STANZA_START
|
123
|
+
yielder << Stanza.new($1.strip)
|
124
|
+
when TAG_VALUE
|
125
|
+
yielder << [$1.strip,$2.strip]
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
data/test/data/ro.obo
ADDED
@@ -0,0 +1,235 @@
|
|
1
|
+
format-version: 1.2
|
2
|
+
saved-by: cjm
|
3
|
+
auto-generated-by: cjm
|
4
|
+
default-namespace: relationship
|
5
|
+
remark: <p>This ontology contains logical relations to be shared across the different OBO ontologies. Each OBO ontology is free to extend this set with relations specific to the biology within that ontology</p><div class="notes"><p>In the definitions, variables c, d, ..., p, q, ... range over instances of continuants and processes respectively. C, D, ..., P, Q, ... range over the corresponding classes</p><p> For a discussion of instance-level relations and also of additional axioms needed to infer transitivity and other properties of the relations listed above see <a href="http://genomebiology.com/2005/6/5/R46">http://genomebiology.com/2005/6/5/R46</a> or the OBO relations page hosted at <a href="http://obo.sourceforge.net/relationship">http://obo.sourceforge.net/relationship</a></div>
|
6
|
+
idspace: OBO_REL http://www.obofoundry.org/ro/ro.owl# "OBO Relation ontology official home on OBO Foundry"
|
7
|
+
remark: cvs version $Revision: 1.4 $
|
8
|
+
remark: release version 1.01
|
9
|
+
|
10
|
+
[Typedef]
|
11
|
+
id: OBO_REL:is_a
|
12
|
+
alt_id: OBO_REL:0000001
|
13
|
+
name: is_a
|
14
|
+
builtin: true
|
15
|
+
def: "For continuants: C is_a C' if and only if: given any c that instantiates C at a time t, c instantiates C' at t. For processes: P is_a P' if and only if: that given any p that instantiates P, then p instantiates P'." [PMID:15892874]
|
16
|
+
comment: The is_a relationship is considered axiomatic by the obo file format specification. In the representation of obo in OWL, where obo terms are represented as OWL classes, is_a is mapped on to the subClassOf axiom
|
17
|
+
exact_synonym: "is_subtype_of" []
|
18
|
+
xref: owl:subClassOf
|
19
|
+
is_reflexive: true
|
20
|
+
is_anti_symmetric: true
|
21
|
+
is_transitive: true
|
22
|
+
|
23
|
+
[Typedef]
|
24
|
+
id: OBO_REL:part_of
|
25
|
+
alt_id: OBO_REL:0000002
|
26
|
+
name: part_of
|
27
|
+
def: "For continuants: C part_of C' if and only if: given any c that instantiates C at a time t, there is some c' such that c' instantiates C' at time t, and c *part_of* c' at t. For processes: P part_of P' if and only if: given any p that instantiates P at a time t, there is some p' such that p' instantiates P' at time t, and p *part_of* p' at t. (Here *part_of* is the instance-level part-relation.)" [PMID:15892874]
|
28
|
+
comment: Parthood as a relation between instances: The primitive instance-level relation p part_of p1 is illustrated in assertions such as: this instance of rhodopsin mediated phototransduction part_of this instance of visual perception. This relation satisfies at least the following standard axioms of mereology: reflexivity (for all p, p part_of p); anti-symmetry (for all p, p1, if p part_of p1 and p1 part_of p then p and p1 are identical); and transitivity (for all p, p1, p2, if p part_of p1 and p1 part_of p2, then p part_of p2). Analogous axioms hold also for parthood as a relation between spatial regions. For parthood as a relation between continuants, these axioms need to be modified to take account of the incorporation of a temporal argument. Thus for example the axiom of transitivity for continuants will assert that if c part_of c1 at t and c1 part_of c2 at t, then also c part_of c2 at t. Parthood as a relation between classes: To define part_of as a relation between classes we again need to distinguish the two cases of continuants and processes, even though the explicit reference to instants of time now falls away. For continuants, we have C part_of C1 if and only if any instance of C at any time is an instance-level part of some instance of C1 at that time, as for example in: cell nucleus part_ of cell.
|
29
|
+
inverse_of_on_instance_level: OBO_REL:has_part
|
30
|
+
is_reflexive: true
|
31
|
+
is_anti_symmetric: true
|
32
|
+
is_transitive: true
|
33
|
+
|
34
|
+
[Typedef]
|
35
|
+
id: OBO_REL:has_part
|
36
|
+
alt_id: OBO_REL:0000003
|
37
|
+
name: has_part
|
38
|
+
inverse_of_on_instance_level: OBO_REL:part_of
|
39
|
+
is_reflexive: true
|
40
|
+
is_anti_symmetric: true
|
41
|
+
is_transitive: true
|
42
|
+
|
43
|
+
[Typedef]
|
44
|
+
id: OBO_REL:integral_part_of
|
45
|
+
alt_id: OBO_REL:0000004
|
46
|
+
name: integral_part_of
|
47
|
+
is_a: OBO_REL:part_of
|
48
|
+
def: "C integral_part_of C' if and only if: C part_of C' AND C' has_part C" [PMID:15892874]
|
49
|
+
inverse_of: OBO_REL:has_integral_part
|
50
|
+
is_reflexive: true
|
51
|
+
is_anti_symmetric: true
|
52
|
+
is_transitive: true
|
53
|
+
|
54
|
+
[Typedef]
|
55
|
+
id: OBO_REL:has_integral_part
|
56
|
+
alt_id: OBO_REL:0000005
|
57
|
+
name: has_integral_part
|
58
|
+
is_a: OBO_REL:has_part
|
59
|
+
inverse_of: OBO_REL:integral_part_of
|
60
|
+
is_reflexive: true
|
61
|
+
is_anti_symmetric: true
|
62
|
+
is_transitive: true
|
63
|
+
|
64
|
+
[Typedef]
|
65
|
+
id: OBO_REL:proper_part_of
|
66
|
+
alt_id: OBO_REL:0000006
|
67
|
+
name: proper_part_of
|
68
|
+
is_a: OBO_REL:part_of
|
69
|
+
def: "As for part_of, with the additional constraint that subject and object are distinct" [PMID:15892874]
|
70
|
+
inverse_of_on_instance_level: OBO_REL:has_proper_part
|
71
|
+
is_transitive: true
|
72
|
+
|
73
|
+
[Typedef]
|
74
|
+
id: OBO_REL:has_proper_part
|
75
|
+
alt_id: OBO_REL:0000007
|
76
|
+
name: has_proper_part
|
77
|
+
is_a: OBO_REL:has_part
|
78
|
+
inverse_of_on_instance_level: OBO_REL:proper_part_of
|
79
|
+
is_transitive: true
|
80
|
+
|
81
|
+
[Typedef]
|
82
|
+
id: OBO_REL:located_in
|
83
|
+
alt_id: OBO_REL:0000008
|
84
|
+
name: located_in
|
85
|
+
def: "C located_in C' if and only if: given any c that instantiates C at a time t, there is some c' such that: c' instantiates C' at time t and c *located_in* c'. (Here *located_in* is the instance-level location relation.)" [PMID:15892874]
|
86
|
+
comment: Location as a relation between instances: The primitive instance-level relation c located_in r at t reflects the fact that each continuant is at any given time associated with exactly one spatial region, namely its exact location. Following we can use this relation to define a further instance-level location relation - not between a continuant and the region which it exactly occupies, but rather between one continuant and another. c is located in c1, in this sense, whenever the spatial region occupied by c is part_of the spatial region occupied by c1. Note that this relation comprehends both the relation of exact location between one continuant and another which obtains when r and r1 are identical (for example, when a portion of fluid exactly fills a cavity), as well as those sorts of inexact location relations which obtain, for example, between brain and head or between ovum and uterus
|
87
|
+
inverse_of_on_instance_level: OBO_REL:location_of
|
88
|
+
is_transitive: true
|
89
|
+
is_reflexive: true
|
90
|
+
|
91
|
+
[Typedef]
|
92
|
+
id: OBO_REL:location_of
|
93
|
+
alt_id: OBO_REL:0000009
|
94
|
+
name: location_of
|
95
|
+
inverse_of_on_instance_level: OBO_REL:located_in
|
96
|
+
is_transitive: true
|
97
|
+
is_reflexive: true
|
98
|
+
|
99
|
+
[Typedef]
|
100
|
+
id: OBO_REL:contained_in
|
101
|
+
alt_id: OBO_REL:0000010
|
102
|
+
name: contained_in
|
103
|
+
inverse_of_on_instance_level: OBO_REL:contains
|
104
|
+
def: "C contained_in C' if and only if: given any instance c that instantiates C at a time t, there is some c' such that: c' instantiates C' at time t and c located_in c' at t, and it is not the case that c *overlaps* c' at t. (c' is a conduit or cavity.)" [PMID:15892874]
|
105
|
+
comment: Containment obtains in each case between material and immaterial continuants, for instance: lung contained_in thoracic cavity; bladder contained_in pelvic cavity. Hence containment is not a transitive relation. If c part_of c1 at t then we have also, by our definition and by the axioms of mereology applied to spatial regions, c located_in c1 at t. Thus, many examples of instance-level location relations for continuants are in fact cases of instance-level parthood. For material continuants location and parthood coincide. Containment is location not involving parthood, and arises only where some immaterial continuant is involved. To understand this relation, we first define overlap for continuants as follows: c1 overlap c2 at t =def for some c, c part_of c1 at t and c part_of c2 at t. The containment relation on the instance level can then be defined (see definition):
|
106
|
+
|
107
|
+
[Typedef]
|
108
|
+
id: OBO_REL:contains
|
109
|
+
alt_id: OBO_REL:0000011
|
110
|
+
name: contains
|
111
|
+
inverse_of_on_instance_level: OBO_REL:contained_in
|
112
|
+
|
113
|
+
[Typedef]
|
114
|
+
id: OBO_REL:adjacent_to
|
115
|
+
alt_id: OBO_REL:0000012
|
116
|
+
name: adjacent_to
|
117
|
+
def: "C adjacent to C' if and only if: given any instance c that instantiates C at a time t, there is some c' such that: c' instantiates C' at time t and c and c' are in spatial proximity" [PMID:15892874]
|
118
|
+
comment: Note that adjacent_to as thus defined is not a symmetric relation, in contrast to its instance-level counterpart. For it can be the case that Cs are in general such as to be adjacent to instances of C1 while no analogous statement holds for C1s in general in relation to instances of C. Examples are: nuclear membrane adjacent_to cytoplasm; seminal vesicle adjacent_to urinary bladder; ovary adjacent_to parietal pelvic peritoneum
|
119
|
+
instance_level_is_transitive: true
|
120
|
+
|
121
|
+
[Typedef]
|
122
|
+
id: OBO_REL:transformation_of
|
123
|
+
alt_id: OBO_REL:0000013
|
124
|
+
name: transformation_of
|
125
|
+
def: "Relation between two classes, in which instances retain their identity yet change their classification by virtue of some kind of transformation. Formally: C transformation_of C' if and only if given any c and any t, if c instantiates C at time t, then for some t', c instantiates C' at t' and t' earlier t, and there is no t2 such that c instantiates C at t2 and c instantiates C' at t2." [PMID:15892874]
|
126
|
+
comment: When an embryonic oenocyte (a type of insect cell) is transformed into a larval oenocyte, one and the same continuant entity preserves its identity while instantiating distinct classes at distinct times. The class-level relation transformation_of obtains between continuant classes C and C1 wherever each instance of the class C is such as to have existed at some earlier time as an instance of the distinct class C1 (see Figure 2 in paper). This relation is illustrated first of all at the molecular level of granularity by the relation between mature RNA and the pre-RNA from which it is processed, or between (UV-induced) thymine-dimer and thymine dinucleotide. At coarser levels of granularity it is illustrated by the transformations involved in the creation of red blood cells, for example, from reticulocyte to erythrocyte, and by processes of development, for example, from larva to pupa, or from (post-gastrular) embryo to fetus or from child to adult. It is also manifest in pathological transformations, for example, of normal colon into carcinomatous colon. In each such case, one and the same continuant entity instantiates distinct classes at different times in virtue of phenotypic changes.
|
127
|
+
is_transitive: true
|
128
|
+
|
129
|
+
[Typedef]
|
130
|
+
id: OBO_REL:transformed_into
|
131
|
+
alt_id: OBO_REL:0000014
|
132
|
+
name: transformed_into
|
133
|
+
comment: Obsoleted
|
134
|
+
is_obsolete: true
|
135
|
+
|
136
|
+
[Typedef]
|
137
|
+
id: OBO_REL:derives_from
|
138
|
+
alt_id: OBO_REL:0000015
|
139
|
+
name: derives_from
|
140
|
+
def: "Derivation on the instance level (*derives_from*) holds between distinct material continuants when one succeeds the other across a temporal divide in such a way that at least a biologically significant portion of the matter of the earlier continuant is inherited by the later. We say that one class C derives_from class C' if instances of C are connected to instances of C' via some chain of instance-level derivation relations. Example: osteocyte derives_from osteoblast. Formally: C derives_immediately_from C' if and only if: given any c and any t, if c instantiates C at time t, then there is some c' and some t', such that c' instantiates C' at t' and t' earlier-than t and c *derives_from* c'. C derives_from C' if and only if: there is an chain of immediate derivation relations connecting C to C'." [PMID:15892874]
|
141
|
+
comment: Derivation as a relation between instances. The temporal relation of derivation is more complex. Transformation, on the instance level, is just the relation of identity: each adult is identical to some child existing at some earlier time. Derivation on the instance-level is a relation holding between non-identicals. More precisely, it holds between distinct material continuants when one succeeds the other across a temporal divide in such a way that at least a biologically significant portion of the matter of the earlier continuant is inherited by the later. Thus we will have axioms to the effect that from c derives_from c1 we can infer that c and c1 are not identical and that there is some instant of time t such that c1 exists only prior to and c only subsequent to t. We will also be able to infer that the spatial region occupied by c as it begins to exist at t overlaps with the spatial region occupied by c1 as it ceases to exist in the same instant.
|
142
|
+
exact_synonym: "derived_from" []
|
143
|
+
inverse_of_on_instance_level: OBO_REL:derived_into
|
144
|
+
is_transitive: true
|
145
|
+
|
146
|
+
[Typedef]
|
147
|
+
id: OBO_REL:derived_into
|
148
|
+
alt_id: OBO_REL:0000016
|
149
|
+
name: derived_into
|
150
|
+
inverse_of_on_instance_level: OBO_REL:derives_from
|
151
|
+
is_transitive: true
|
152
|
+
|
153
|
+
[Typedef]
|
154
|
+
id: OBO_REL:preceded_by
|
155
|
+
alt_id: OBO_REL:0000017
|
156
|
+
name: preceded_by
|
157
|
+
def: "P preceded_by P' if and only if: given any process p that instantiates P at a time t, there is some process p' such that p' instantiates P' at time t', and t' is earlier than t. " [PMID:15892874]
|
158
|
+
comment: An example is: translation preceded_by transcription; aging preceded_by development (not however death preceded_by aging). Where derives_from links classes of continuants, preceded_by links classes of processes. Clearly, however, these two relations are not independent of each other. Thus if cells of type C1 derive_from cells of type C, then any cell division involving an instance of C1 in a given lineage is preceded_by cellular processes involving an instance of C. The assertion P preceded_by P1 tells us something about Ps in general: that is, it tells us something about what happened earlier, given what we know about what happened later. Thus it does not provide information pointing in the opposite direction, concerning instances of P1 in general; that is, that each is such as to be succeeded by some instance of P. Note that an assertion to the effect that P preceded_by P1 is rather weak; it tells us little about the relations between the underlying instances in virtue of which the preceded_by relation obtains. Typically we will be interested in stronger relations, for example in the relation immediately_preceded_by, or in relations which combine preceded_by with a condition to the effect that the corresponding instances of P and P1 share participants, or that their participants are connected by relations of derivation, or (as a first step along the road to a treatment of causality) that the one process in some way affects (for example, initiates or regulates) the other.
|
159
|
+
inverse_of_on_instance_level: OBO_REL:precedes
|
160
|
+
is_transitive: true
|
161
|
+
|
162
|
+
[Typedef]
|
163
|
+
id: OBO_REL:precedes
|
164
|
+
alt_id: OBO_REL:0000018
|
165
|
+
name: precedes
|
166
|
+
inverse_of_on_instance_level: OBO_REL:preceded_by
|
167
|
+
is_transitive: true
|
168
|
+
|
169
|
+
[Typedef]
|
170
|
+
id: OBO_REL:has_participant
|
171
|
+
alt_id: OBO_REL:0000019
|
172
|
+
name: has_participant
|
173
|
+
def: "P has_participant C if and only if: given any process p that instantiates P there is some continuant c, and some time t, such that: c instantiates C at t and c participates in p at t" [PMID:15892874]
|
174
|
+
comment: Has_participant is a primitive instance-level relation between a process, a continuant, and a time at which the continuant participates in some way in the process. The relation obtains, for example, when this particular process of oxygen exchange across this particular alveolar membrane has_participant this particular sample of hemoglobin at this particular time.
|
175
|
+
inverse_of_on_instance_level: OBO_REL:participates_in
|
176
|
+
|
177
|
+
[Typedef]
|
178
|
+
id: OBO_REL:participates_in
|
179
|
+
alt_id: OBO_REL:0000020
|
180
|
+
name: participates_in
|
181
|
+
inverse_of_on_instance_level: OBO_REL:has_participant
|
182
|
+
|
183
|
+
[Typedef]
|
184
|
+
id: OBO_REL:has_agent
|
185
|
+
alt_id: OBO_REL:0000021
|
186
|
+
name: has_agent
|
187
|
+
is_a: OBO_REL:has_participant
|
188
|
+
def: "As for has_participant, but with the additional condition that the component instance is causally active in the relevant process" [PMID:15892874]
|
189
|
+
inverse_of_on_instance_level: OBO_REL:agent_in
|
190
|
+
|
191
|
+
[Typedef]
|
192
|
+
id: OBO_REL:agent_in
|
193
|
+
alt_id: OBO_REL:0000022
|
194
|
+
name: agent_in
|
195
|
+
is_a: OBO_REL:participates_in
|
196
|
+
inverse_of_on_instance_level: OBO_REL:has_agent
|
197
|
+
|
198
|
+
[Typedef]
|
199
|
+
id: OBO_REL:instance_of
|
200
|
+
alt_id: OBO_REL:0000023
|
201
|
+
name: instance_of
|
202
|
+
builtin: true
|
203
|
+
def: "A relation between an instance and a class. For components: a primitive relation between a component instance and a class which it instantiates at a specific time. For processes: a primitive relation, between a process instance and a class which it instantiates, holding independently of time" [PMID:15892874]
|
204
|
+
comment: The instance_of relationship is considered axiomatic by the obo file format specification; ie it is taken for granted. The is_a relation is still included in this ontology for completeness
|
205
|
+
|
206
|
+
[Typedef]
|
207
|
+
id: OBO_REL:has_improper_part
|
208
|
+
alt_id: OBO_REL:0000024
|
209
|
+
name: has_improper_part
|
210
|
+
is_a: OBO_REL:has_part
|
211
|
+
inverse_of_on_instance_level: OBO_REL:improper_part_of
|
212
|
+
comment: See reasons for obsoletion of improper_part_of
|
213
|
+
is_reflexive: true
|
214
|
+
is_transitive: true
|
215
|
+
is_obsolete: true
|
216
|
+
|
217
|
+
[Typedef]
|
218
|
+
id: OBO_REL:improper_part_of
|
219
|
+
alt_id: OBO_REL:0000025
|
220
|
+
name: improper_part_of
|
221
|
+
is_a: OBO_REL:part_of
|
222
|
+
def: "As for part_of, with the additional constraint that subject and object may be identical" [PMID:15892874]
|
223
|
+
comment: OBSOLETE. The definition is "As for part_of, with the additional constraint that subject and object may be identical". However, part_of is already reflexive, therefore improper_part_of is identical to part_of. If read differently, as "improper_part_of is part_of but not proper_part_of",improper_part_of becomes identity. So, improper_part_of is either identical to part_of or to identity, and not an intuitive synonym for either of them. [Robert Hoehndorf]
|
224
|
+
inverse_of_on_instance_level: OBO_REL:has_improper_part
|
225
|
+
is_reflexive: true
|
226
|
+
is_transitive: true
|
227
|
+
is_obsolete: true
|
228
|
+
|
229
|
+
|
230
|
+
[Typedef]
|
231
|
+
id: OBO_REL:relationship
|
232
|
+
name: relationship
|
233
|
+
def: "A relationship between two classes (terms). Relationships between classes are expressed in terms of relations on underlying instances." [GOC:cjm]
|
234
|
+
is_obsolete: true
|
235
|
+
comment: this relation was superfluous, so it has been obsoleted
|