Mercurial > repos > mahtabm > ensembl
comparison variant_effect_predictor/Bio/Ontology/OntologyEngineI.pm @ 0:1f6dce3d34e0
Uploaded
| author | mahtabm |
|---|---|
| date | Thu, 11 Apr 2013 02:01:53 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:1f6dce3d34e0 |
|---|---|
| 1 # $Id: OntologyEngineI.pm,v 1.2.2.3 2003/03/27 10:07:56 lapp Exp $ | |
| 2 # | |
| 3 # BioPerl module for OntologyEngineI | |
| 4 # | |
| 5 # Cared for by Peter Dimitrov <dimitrov@gnf.org> | |
| 6 # | |
| 7 # (c) Peter Dimitrov | |
| 8 # (c) GNF, Genomics Institute of the Novartis Research Foundation, 2002. | |
| 9 # | |
| 10 # You may distribute this module under the same terms as perl itself. | |
| 11 # Refer to the Perl Artistic License (see the license accompanying this | |
| 12 # software package, or see http://www.perl.com/language/misc/Artistic.html) | |
| 13 # for the terms under which you may use, modify, and redistribute this module. | |
| 14 # | |
| 15 # THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED | |
| 16 # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF | |
| 17 # MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. | |
| 18 # | |
| 19 # You may distribute this module under the same terms as perl itself | |
| 20 | |
| 21 # POD documentation - main docs before the code | |
| 22 | |
| 23 =head1 NAME | |
| 24 | |
| 25 OntologyEngineI - Interface a minimal Ontology implementation should satisfy | |
| 26 | |
| 27 =head1 SYNOPSIS | |
| 28 | |
| 29 # see documentation of methods | |
| 30 | |
| 31 =head1 DESCRIPTION | |
| 32 | |
| 33 This describes the minimal interface an ontology query engine should | |
| 34 provide. It intentionally doesn't make explicit references to the | |
| 35 ontology being a DAG, nor does it mandate that the ontology be a | |
| 36 vocabulary. Rather, it tries to generically express what should be | |
| 37 accessible (queriable) about an ontology. | |
| 38 | |
| 39 The idea is to allow for different implementations for different | |
| 40 purposes, which may then differ as to which operations are efficient | |
| 41 and which aren't, and how much richer the functionality is on top of | |
| 42 this minimalistic set of methods. Check modules in the Bio::Ontology | |
| 43 namespace to find out which implementations exist. At the time of | |
| 44 writing, there is a SimpleOntologyEngine (which does not use | |
| 45 Graph.pm), and a Graph.pm-based implementation in SimpleGOEngine. | |
| 46 | |
| 47 Ontology parsers in Bio::OntologyIO are required to return an | |
| 48 implementation of this interface. | |
| 49 | |
| 50 =head1 FEEDBACK | |
| 51 | |
| 52 =head2 Mailing Lists | |
| 53 | |
| 54 User feedback is an integral part of the evolution of this and other | |
| 55 Bioperl modules. Send your comments and suggestions preferably to | |
| 56 the Bioperl mailing list. Your participation is much appreciated. | |
| 57 | |
| 58 bioperl-l@bioperl.org - General discussion | |
| 59 http://bioperl.org/MailList.shtml - About the mailing lists | |
| 60 | |
| 61 =head2 Reporting Bugs | |
| 62 | |
| 63 Report bugs to the Bioperl bug tracking system to help us keep track | |
| 64 of the bugs and their resolution. Bug reports can be submitted via | |
| 65 email or the web: | |
| 66 | |
| 67 bioperl-bugs@bioperl.org | |
| 68 http://bugzilla.bioperl.org/ | |
| 69 | |
| 70 =head1 AUTHOR - Peter Dimitrov | |
| 71 | |
| 72 Email dimitrov@gnf.org | |
| 73 | |
| 74 Describe contact details here | |
| 75 | |
| 76 =head1 CONTRIBUTORS | |
| 77 | |
| 78 Additional contributors names and emails here | |
| 79 | |
| 80 =head1 APPENDIX | |
| 81 | |
| 82 The rest of the documentation details each of the object methods. | |
| 83 Internal methods are usually preceded with a _ | |
| 84 | |
| 85 =cut | |
| 86 | |
| 87 | |
| 88 # Let the code begin... | |
| 89 | |
| 90 | |
| 91 package Bio::Ontology::OntologyEngineI; | |
| 92 use vars qw(@ISA); | |
| 93 use strict; | |
| 94 use Carp; | |
| 95 use Bio::Root::RootI; | |
| 96 | |
| 97 @ISA = qw( Bio::Root::RootI ); | |
| 98 | |
| 99 =head2 add_term | |
| 100 | |
| 101 Title : add_term | |
| 102 Usage : add_term(TermI term): TermI | |
| 103 Function: Adds TermI object to the ontology engine term store | |
| 104 Example : $oe->add_term($term) | |
| 105 Returns : its argument. | |
| 106 Args : object of class TermI. | |
| 107 | |
| 108 | |
| 109 =cut | |
| 110 | |
| 111 sub add_term{ | |
| 112 shift->throw_not_implemented(); | |
| 113 } | |
| 114 | |
| 115 =head2 add_relationship | |
| 116 | |
| 117 Title : add_relationship | |
| 118 Usage : add_relationship(RelationshipI relationship): RelationshipI | |
| 119 Function: Adds a relationship object to the ontology engine. | |
| 120 Example : | |
| 121 Returns : Its argument. | |
| 122 Args : A RelationshipI object. | |
| 123 | |
| 124 | |
| 125 =cut | |
| 126 | |
| 127 sub add_relationship{ | |
| 128 shift->throw_not_implemented(); | |
| 129 } | |
| 130 | |
| 131 =head2 get_relationships | |
| 132 | |
| 133 Title : get_relationships | |
| 134 Usage : get_relationships(TermI term): RelationshipI[] | |
| 135 Function: Retrieves all relationship objects from this ontology engine, | |
| 136 or all relationships of a term if a term is supplied. | |
| 137 Example : | |
| 138 Returns : Array of Bio::Ontology::RelationshipI objects | |
| 139 Args : None, or a Bio::Ontology::TermI compliant object for which | |
| 140 to retrieve the relationships. | |
| 141 | |
| 142 | |
| 143 =cut | |
| 144 | |
| 145 sub get_relationships{ | |
| 146 shift->throw_not_implemented(); | |
| 147 } | |
| 148 | |
| 149 =head2 get_predicate_terms | |
| 150 | |
| 151 Title : get_predicate_terms | |
| 152 Usage : get_predicate_terms(): TermI[] | |
| 153 Function: | |
| 154 Example : | |
| 155 Returns : | |
| 156 Args : | |
| 157 | |
| 158 | |
| 159 =cut | |
| 160 | |
| 161 sub get_predicate_terms{ | |
| 162 shift->throw_not_implemented(); | |
| 163 } | |
| 164 | |
| 165 =head2 get_child_terms | |
| 166 | |
| 167 Title : get_child_terms | |
| 168 Usage : get_child_terms(TermI term, TermI[] predicate_terms): TermI[] | |
| 169 Function: Retrieves all child terms of a given term, that satisfy a | |
| 170 relationship among those that are specified in the second | |
| 171 argument or undef otherwise. get_child_terms is a special | |
| 172 case of get_descendant_terms, limiting the search to the | |
| 173 direct descendants. | |
| 174 | |
| 175 Example : | |
| 176 Returns : Array of TermI objects. | |
| 177 Args : First argument is the term of interest, second is the list | |
| 178 of relationship type terms. | |
| 179 | |
| 180 | |
| 181 =cut | |
| 182 | |
| 183 sub get_child_terms{ | |
| 184 shift->throw_not_implemented(); | |
| 185 } | |
| 186 | |
| 187 =head2 get_descendant_terms | |
| 188 | |
| 189 Title : get_descendant_terms | |
| 190 Usage : get_descendant_terms(TermI term, TermI[] rel_types): TermI[] | |
| 191 Function: Retrieves all descendant terms of a given term, that | |
| 192 satisfy a relationship among those that are specified in | |
| 193 the second argument or undef otherwise. | |
| 194 Example : | |
| 195 Returns : Array of TermI objects. | |
| 196 Args : First argument is the term of interest, second is the list | |
| 197 of relationship type terms. | |
| 198 | |
| 199 | |
| 200 =cut | |
| 201 | |
| 202 sub get_descendant_terms{ | |
| 203 shift->throw_not_implemented(); | |
| 204 } | |
| 205 | |
| 206 =head2 get_parent_terms | |
| 207 | |
| 208 Title : get_parent_terms | |
| 209 Usage : get_parent_terms(TermI term, TermI[] predicate_terms): TermI[] | |
| 210 Function: Retrieves all parent terms of a given term, that satisfy a | |
| 211 relationship among those that are specified in the second | |
| 212 argument or undef otherwise. get_parent_terms is a special | |
| 213 case of get_ancestor_terms, limiting the search to the | |
| 214 direct ancestors. | |
| 215 | |
| 216 Example : | |
| 217 Returns : Array of TermI objects. | |
| 218 Args : First argument is the term of interest, second is the list | |
| 219 of relationship type terms. | |
| 220 | |
| 221 | |
| 222 =cut | |
| 223 | |
| 224 sub get_parent_terms{ | |
| 225 shift->throw_not_implemented(); | |
| 226 } | |
| 227 | |
| 228 =head2 get_ancestor_terms | |
| 229 | |
| 230 Title : get_ancestor_terms | |
| 231 Usage : get_ancestor_terms(TermI term, TermI[] predicate_terms): TermI[] | |
| 232 Function: Retrieves all ancestor terms of a given term, that satisfy | |
| 233 a relationship among those that are specified in the second | |
| 234 argument or undef otherwise. | |
| 235 | |
| 236 Example : | |
| 237 Returns : Array of TermI objects. | |
| 238 Args : First argument is the term of interest, second is the list | |
| 239 of relationship type terms. | |
| 240 | |
| 241 | |
| 242 =cut | |
| 243 | |
| 244 sub get_ancestor_terms{ | |
| 245 shift->throw_not_implemented(); | |
| 246 } | |
| 247 | |
| 248 =head2 get_leaf_terms | |
| 249 | |
| 250 Title : get_leaf_terms | |
| 251 Usage : get_leaf_terms(): TermI[] | |
| 252 Function: Retrieves all leaf terms from the ontology. Leaf term is a | |
| 253 term w/o descendants. | |
| 254 | |
| 255 Example : @leaf_terms = $obj->get_leaf_terms() | |
| 256 Returns : Array of TermI objects. | |
| 257 Args : | |
| 258 | |
| 259 | |
| 260 =cut | |
| 261 | |
| 262 sub get_leaf_terms{ | |
| 263 shift->throw_not_implemented(); | |
| 264 } | |
| 265 | |
| 266 =head2 get_root_terms | |
| 267 | |
| 268 Title : get_root_terms | |
| 269 Usage : get_root_terms(): TermI[] | |
| 270 Function: Retrieves all root terms from the ontology. Root term is a | |
| 271 term w/o ancestors. | |
| 272 | |
| 273 Example : @root_terms = $obj->get_root_terms() | |
| 274 Returns : Array of TermI objects. | |
| 275 Args : | |
| 276 | |
| 277 | |
| 278 =cut | |
| 279 | |
| 280 sub get_root_terms{ | |
| 281 shift->throw_not_implemented(); | |
| 282 } | |
| 283 | |
| 284 =head1 Factory for relationships and terms | |
| 285 | |
| 286 =cut | |
| 287 | |
| 288 =head2 relationship_factory | |
| 289 | |
| 290 Title : relationship_factory | |
| 291 Usage : $fact = $obj->relationship_factory() | |
| 292 Function: Get (and set, if the implementation supports it) the object | |
| 293 factory to be used when relationship objects are created by | |
| 294 the implementation on-the-fly. | |
| 295 | |
| 296 Example : | |
| 297 Returns : value of relationship_factory (a Bio::Factory::ObjectFactory | |
| 298 compliant object) | |
| 299 Args : | |
| 300 | |
| 301 | |
| 302 =cut | |
| 303 | |
| 304 sub relationship_factory{ | |
| 305 return shift->throw_not_implemented(); | |
| 306 } | |
| 307 | |
| 308 =head2 term_factory | |
| 309 | |
| 310 Title : term_factory | |
| 311 Usage : $fact = $obj->term_factory() | |
| 312 Function: Get (and set, if the implementation supports it) the object | |
| 313 factory to be used when term objects are created by | |
| 314 the implementation on-the-fly. | |
| 315 | |
| 316 Example : | |
| 317 Returns : value of term_factory (a Bio::Factory::ObjectFactory | |
| 318 compliant object) | |
| 319 Args : | |
| 320 | |
| 321 | |
| 322 =cut | |
| 323 | |
| 324 sub term_factory{ | |
| 325 return shift->throw_not_implemented(); | |
| 326 } | |
| 327 | |
| 328 =head1 Decorator Methods | |
| 329 | |
| 330 These methods come with a default implementation that uses the | |
| 331 abstract methods defined for this interface. This may not be very | |
| 332 efficient, and hence implementors are encouraged to override these | |
| 333 methods if they can provide more efficient implementations. | |
| 334 | |
| 335 =cut | |
| 336 | |
| 337 =head2 get_all_terms | |
| 338 | |
| 339 Title : get_all_terms | |
| 340 Usage : get_all_terms: TermI[] | |
| 341 Function: Retrieves all terms from the ontology. | |
| 342 | |
| 343 This is more a decorator method. We provide a default | |
| 344 implementation here that loops over all root terms and gets | |
| 345 all descendants for each root term. The overall union of | |
| 346 terms is then made unique by name and ontology. | |
| 347 | |
| 348 We do not mandate an order here in which the terms are | |
| 349 returned. In fact, the default implementation will return | |
| 350 them in unpredictable order. | |
| 351 | |
| 352 Engine implementations that can provide a more efficient | |
| 353 method for obtaining all terms should definitely override | |
| 354 this. | |
| 355 | |
| 356 Example : @terms = $obj->get_all_terms() | |
| 357 Returns : Array of TermI objects. | |
| 358 Args : | |
| 359 | |
| 360 | |
| 361 =cut | |
| 362 | |
| 363 sub get_all_terms{ | |
| 364 my $self = shift; | |
| 365 # get all root nodes | |
| 366 my @roots = $self->get_root_terms(); | |
| 367 # accumulate all descendants for each root term | |
| 368 my @terms = map { $self->get_descendant_terms($_); } @roots; | |
| 369 # add on the root terms themselves | |
| 370 push(@terms, @roots); | |
| 371 # make unique by name and ontology | |
| 372 my %name_map = map { ($_->name."@".$_->ontology->name, $_); } @terms; | |
| 373 # done | |
| 374 return values %name_map; | |
| 375 } | |
| 376 | |
| 377 =head2 find_terms | |
| 378 | |
| 379 Title : find_terms | |
| 380 Usage : ($term) = $oe->find_terms(-identifier => "SO:0000263"); | |
| 381 Function: Find term instances matching queries for their attributes. | |
| 382 | |
| 383 An implementation may not support querying for arbitrary | |
| 384 attributes, but can generally be expected to accept | |
| 385 -identifier and -name as queries. If both are provided, | |
| 386 they are implicitly intersected. | |
| 387 | |
| 388 Example : | |
| 389 Returns : an array of zero or more Bio::Ontology::TermI objects | |
| 390 Args : Named parameters. The following parameters should be recognized | |
| 391 by any implementation: | |
| 392 | |
| 393 -identifier query by the given identifier | |
| 394 -name query by the given name | |
| 395 | |
| 396 | |
| 397 =cut | |
| 398 | |
| 399 sub find_terms{ | |
| 400 my $self = shift; | |
| 401 my %params = @_; | |
| 402 @params{ map { lc $_; } keys %params } = values %params; # lowercase keys | |
| 403 | |
| 404 my @terms = grep { | |
| 405 my $ok = exists($params{-identifier}) ? | |
| 406 $_->identifier() eq $params{-identifier} : 1; | |
| 407 $ok && ((! exists($params{-name})) || | |
| 408 ($_->name() eq $params{-name})); | |
| 409 } $self->get_all_terms(); | |
| 410 return @terms; | |
| 411 } | |
| 412 | |
| 413 1; |
