0
|
1 # $Id: Ontology.pm,v 1.2.2.4 2003/03/27 10:07:56 lapp Exp $
|
|
2 #
|
|
3 # BioPerl module for Bio::Ontology::Ontology
|
|
4 #
|
|
5 # Cared for by Hilmar Lapp <hlapp at gmx.net>
|
|
6 #
|
|
7 # Copyright Hilmar Lapp
|
|
8 #
|
|
9 # You may distribute this module under the same terms as perl itself
|
|
10
|
|
11 #
|
|
12 # (c) Hilmar Lapp, hlapp at gmx.net, 2003.
|
|
13 # (c) GNF, Genomics Institute of the Novartis Research Foundation, 2003.
|
|
14 #
|
|
15 # You may distribute this module under the same terms as perl itself.
|
|
16 # Refer to the Perl Artistic License (see the license accompanying this
|
|
17 # software package, or see http://www.perl.com/language/misc/Artistic.html)
|
|
18 # for the terms under which you may use, modify, and redistribute this module.
|
|
19 #
|
|
20 # THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
21 # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
22 # MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
23 #
|
|
24
|
|
25 # POD documentation - main docs before the code
|
|
26
|
|
27 =head1 NAME
|
|
28
|
|
29 Bio::Ontology::Ontology - standard implementation of an Ontology
|
|
30
|
|
31 =head1 SYNOPSIS
|
|
32
|
|
33 use Bio::Ontology::Ontology;
|
|
34
|
|
35 # create ontology object
|
|
36 my $ont = Bio::Ontology::Ontology->new(-name => "OBF");
|
|
37
|
|
38 # add terms, relationships ...
|
|
39 my $bp = Bio::Ontology::Term->new(-name => "Bioperl");
|
|
40 my $obf = Bio::Ontology::Term->new(-name => "OBF");
|
|
41 my $partof = Bio::Ontology::RelationshipType->get_instance("PART_OF");
|
|
42 $ont->add_term($bp);
|
|
43 $ont->add_term($obf);
|
|
44 $ont->add_relationship($bp, $obf, $partof);
|
|
45
|
|
46 # then query
|
|
47 my @terms = $ont->get_root_terms(); # "OBF"
|
|
48 my @desc = $ont->get_descendant_terms($terms[0], $partof); # "Bioperl"
|
|
49 # ... see methods for other ways to query
|
|
50
|
|
51 # for advanced users, you can re-use the query engine outside of an
|
|
52 # ontology to let one instance manage multiple ontologies
|
|
53 my $ont2 = Bio::Ontology::Ontology->new(-name => "Foundations",
|
|
54 -engine => $ont->engine());
|
|
55
|
|
56
|
|
57 =head1 DESCRIPTION
|
|
58
|
|
59 This is a no-frills implementation of L<Bio::Ontology::OntologyI>.
|
|
60
|
|
61 The query functions are implemented by delegation to an
|
|
62 OntologyEngineI implementation.
|
|
63
|
|
64 =head1 FEEDBACK
|
|
65
|
|
66 =head2 Mailing Lists
|
|
67
|
|
68 User feedback is an integral part of the evolution of this and other
|
|
69 Bioperl modules. Send your comments and suggestions preferably to
|
|
70 the Bioperl mailing list. Your participation is much appreciated.
|
|
71
|
|
72 bioperl-l@bioperl.org - General discussion
|
|
73 http://bioperl.org/MailList.shtml - About the mailing lists
|
|
74
|
|
75 =head2 Reporting Bugs
|
|
76
|
|
77 Report bugs to the Bioperl bug tracking system to help us keep track
|
|
78 of the bugs and their resolution. Bug reports can be submitted via
|
|
79 the web:
|
|
80
|
|
81 http://bugzilla.bioperl.org/
|
|
82
|
|
83 =head1 AUTHOR - Hilmar Lapp
|
|
84
|
|
85 Email hlapp at gmx.net
|
|
86
|
|
87 =head1 CONTRIBUTORS
|
|
88
|
|
89 Additional contributors names and emails here
|
|
90
|
|
91 =head1 APPENDIX
|
|
92
|
|
93 The rest of the documentation details each of the object methods.
|
|
94 Internal methods are usually preceded with a _
|
|
95
|
|
96 =cut
|
|
97
|
|
98
|
|
99 # Let the code begin...
|
|
100
|
|
101
|
|
102 package Bio::Ontology::Ontology;
|
|
103 use vars qw(@ISA);
|
|
104 use strict;
|
|
105
|
|
106 # Object preamble - inherits from Bio::Root::Root
|
|
107
|
|
108 use Bio::Root::Root;
|
|
109 use Bio::Ontology::OntologyI;
|
|
110 use Bio::Ontology::SimpleOntologyEngine;
|
|
111
|
|
112 @ISA = qw(Bio::Root::Root Bio::Ontology::OntologyI);
|
|
113
|
|
114 =head2 new
|
|
115
|
|
116 Title : new
|
|
117 Usage : my $obj = new Bio::Ontology::Ontology();
|
|
118 Function: Builds a new Bio::Ontology::Ontology object
|
|
119 Returns : an instance of Bio::Ontology::Ontology
|
|
120 Args :
|
|
121
|
|
122
|
|
123 =cut
|
|
124
|
|
125 sub new {
|
|
126 my($class,@args) = @_;
|
|
127
|
|
128 my $self = $class->SUPER::new(@args);
|
|
129 my ($name,$auth,$def,$id,$engine) =
|
|
130 $self->_rearrange([qw(NAME
|
|
131 AUTHORITY
|
|
132 DEFINITION
|
|
133 IDENTIFIER
|
|
134 ENGINE)
|
|
135 ],
|
|
136 @args);
|
|
137 defined($name) && $self->name($name);
|
|
138 defined($auth) && $self->authority($auth);
|
|
139 defined($def) && $self->definition($def);
|
|
140 defined($id) && $self->identifier($id);
|
|
141 $engine = Bio::Ontology::SimpleOntologyEngine->new() unless $engine;
|
|
142 $self->engine($engine);
|
|
143
|
|
144 return $self;
|
|
145 }
|
|
146
|
|
147 =head1 Methods from L<Bio::Ontology::OntologyI>
|
|
148
|
|
149 =cut
|
|
150
|
|
151 =head2 name
|
|
152
|
|
153 Title : name
|
|
154 Usage : $obj->name($newval)
|
|
155 Function: Get/set the name of the ontology.
|
|
156 Example :
|
|
157 Returns : value of name (a scalar)
|
|
158 Args : on set, new value (a scalar or undef, optional)
|
|
159
|
|
160
|
|
161 =cut
|
|
162
|
|
163 sub name{
|
|
164 my $self = shift;
|
|
165
|
|
166 return $self->{'name'} = shift if @_;
|
|
167 return $self->{'name'};
|
|
168 }
|
|
169
|
|
170 =head2 authority
|
|
171
|
|
172 Title : authority
|
|
173 Usage : $obj->authority($newval)
|
|
174 Function: Get/set the authority for this ontology, for instance the
|
|
175 DNS base for the organization granting the name of the
|
|
176 ontology and identifiers for the terms.
|
|
177
|
|
178 This attribute is optional and should not generally
|
|
179 expected by applications to have been set. It is here to
|
|
180 follow the rules for namespaces, which ontologies serve as
|
|
181 for terms.
|
|
182
|
|
183 Example :
|
|
184 Returns : value of authority (a scalar)
|
|
185 Args : on set, new value (a scalar or undef, optional)
|
|
186
|
|
187
|
|
188 =cut
|
|
189
|
|
190 sub authority{
|
|
191 my $self = shift;
|
|
192
|
|
193 return $self->{'authority'} = shift if @_;
|
|
194 return $self->{'authority'};
|
|
195 }
|
|
196
|
|
197 =head2 definition
|
|
198
|
|
199 Title : definition
|
|
200 Usage : $obj->definition($newval)
|
|
201 Function: Get/set a descriptive definition of the ontology.
|
|
202 Example :
|
|
203 Returns : value of definition (a scalar)
|
|
204 Args : on set, new value (a scalar or undef, optional)
|
|
205
|
|
206
|
|
207 =cut
|
|
208
|
|
209 sub definition{
|
|
210 my $self = shift;
|
|
211
|
|
212 return $self->{'definition'} = shift if @_;
|
|
213 return $self->{'definition'};
|
|
214 }
|
|
215
|
|
216 =head2 identifier
|
|
217
|
|
218 Title : identifier
|
|
219 Usage : $id = $obj->identifier()
|
|
220 Function: Get an identifier for this ontology.
|
|
221
|
|
222 This is primarily intended for look-up purposes. The value
|
|
223 is not modifiable and is determined automatically by the
|
|
224 implementation. Also, the identifier's uniqueness will only
|
|
225 hold within the scope of a particular application's run
|
|
226 time since it is derived from a memory location.
|
|
227
|
|
228 Example :
|
|
229 Returns : value of identifier (a scalar)
|
|
230 Args :
|
|
231
|
|
232
|
|
233 =cut
|
|
234
|
|
235 sub identifier{
|
|
236 my $self = shift;
|
|
237
|
|
238 if(@_) {
|
|
239 $self->throw("cannot modify identifier for ".ref($self))
|
|
240 if exists($self->{'identifier'});
|
|
241 my $id = shift;
|
|
242 $self->{'identifier'} = $id if $id;
|
|
243 }
|
|
244 if(! exists($self->{'identifier'})) {
|
|
245 ($self->{'identifier'}) = "$self" =~ /(0x[0-9a-fA-F]+)/;
|
|
246 }
|
|
247 return $self->{'identifier'};
|
|
248 }
|
|
249
|
|
250 =head2 close
|
|
251
|
|
252 Title : close
|
|
253 Usage :
|
|
254 Function: Release any resources this ontology may occupy. In order
|
|
255 to efficiently release unused memory or file handles, you
|
|
256 should call this method once you are finished with an
|
|
257 ontology.
|
|
258
|
|
259 Example :
|
|
260 Returns : TRUE on success and FALSE otherwise
|
|
261 Args : none
|
|
262
|
|
263
|
|
264 =cut
|
|
265
|
|
266 sub close{
|
|
267 my $self = shift;
|
|
268
|
|
269 # if it is in the ontology store, remove it from there
|
|
270 my $store = Bio::Ontology::OntologyStore->get_instance();
|
|
271 $store->remove_ontology($self);
|
|
272 # essentially we need to dis-associate from the engine here
|
|
273 $self->engine(undef);
|
|
274 return 1;
|
|
275 }
|
|
276
|
|
277 =head1 Implementation-specific public methods
|
|
278
|
|
279 =cut
|
|
280
|
|
281 =head2 engine
|
|
282
|
|
283 Title : engine
|
|
284 Usage : $engine = $obj->engine()
|
|
285 Function: Get/set the ontology engine to which all the query methods
|
|
286 delegate.
|
|
287 Example :
|
|
288 Returns : an object implementing L<Bio::Ontology::OntologyEngineI>
|
|
289 Args : on set, new value (an object implementing
|
|
290 L<Bio::Ontology::OntologyEngineI>, or undef)
|
|
291
|
|
292
|
|
293 =cut
|
|
294
|
|
295 sub engine{
|
|
296 my $self = shift;
|
|
297
|
|
298 if(@_) {
|
|
299 my $engine = shift;
|
|
300 if($engine && (! (ref($engine) &&
|
|
301 $engine->isa("Bio::Ontology::OntologyEngineI")))) {
|
|
302 $self->throw("object of class ".ref($engine)." does not implement".
|
|
303 " Bio::Ontology::OntologyEngineI. Bummer!");
|
|
304 }
|
|
305 $self->{'engine'} = $engine;
|
|
306 }
|
|
307 return $self->{'engine'};
|
|
308 }
|
|
309
|
|
310 =head1 Methods defined in L<Bio::Ontology::OntologyEngineI>
|
|
311
|
|
312 =cut
|
|
313
|
|
314 =head2 add_term
|
|
315
|
|
316 Title : add_term
|
|
317 Usage : add_term(TermI term): TermI
|
|
318 Function: Adds TermI object to the ontology engine term store
|
|
319
|
|
320 If the ontology property of the term object was not set,
|
|
321 this implementation will set it to itself upon adding the
|
|
322 term.
|
|
323
|
|
324 Example : $oe->add_term($term)
|
|
325 Returns : its argument.
|
|
326 Args : object of class TermI.
|
|
327
|
|
328
|
|
329 =cut
|
|
330
|
|
331 sub add_term{
|
|
332 my $self = shift;
|
|
333 my $term = shift;
|
|
334
|
|
335 # set ontology if not set already
|
|
336 $term->ontology($self) if $term && (! $term->ontology());
|
|
337 return $self->engine->add_term($term,@_);
|
|
338 }
|
|
339
|
|
340 =head2 add_relationship
|
|
341
|
|
342 Title : add_relationship
|
|
343 Usage : add_relationship(RelationshipI relationship): RelationshipI
|
|
344 add_relatioship(TermI subject, TermI predicate, TermI object)
|
|
345 Function: Adds a relationship object to the ontology engine.
|
|
346 Example :
|
|
347 Returns : Its argument.
|
|
348 Args : A RelationshipI object.
|
|
349
|
|
350
|
|
351 =cut
|
|
352
|
|
353 sub add_relationship{
|
|
354 my $self = shift;
|
|
355 my $rel = shift;
|
|
356
|
|
357 if($rel && $rel->isa("Bio::Ontology::TermI")) {
|
|
358 # we need to construct the relationship object on the fly
|
|
359 my ($predicate,$object) = @_;
|
|
360 $rel = Bio::Ontology::Relationship->new(-subject_term => $rel,
|
|
361 -object_term => $object,
|
|
362 -predicate_term => $predicate,
|
|
363 -ontology => $self);
|
|
364 }
|
|
365 # set ontology if not set already
|
|
366 $rel->ontology($self) unless $rel->ontology();
|
|
367 return $self->engine->add_relationship($rel);
|
|
368 }
|
|
369
|
|
370 =head2 get_relationships
|
|
371
|
|
372 Title : get_relationships
|
|
373 Usage : get_relationships(TermI term): RelationshipI[]
|
|
374 Function: Retrieves all relationship objects in the ontology, or all
|
|
375 relationships of a given term.
|
|
376 Example :
|
|
377 Returns : Array of Bio::Ontology::RelationshipI objects
|
|
378 Args : Optionally, a Bio::Ontology::TermI compliant object
|
|
379
|
|
380
|
|
381 =cut
|
|
382
|
|
383 sub get_relationships{
|
|
384 my $self = shift;
|
|
385 my $term = shift;
|
|
386 if($term) {
|
|
387 # we don't need to filter in this case
|
|
388 return $self->engine->get_relationships($term);
|
|
389 }
|
|
390 # else we need to filter by ontology
|
|
391 return grep { my $ont = $_->ontology;
|
|
392 # the first condition is a superset of the second, but
|
|
393 # we add it here for efficiency reasons, as many times
|
|
394 # it will short-cut to true and is supposedly faster than
|
|
395 # string comparison
|
|
396 ($ont == $self) || ($ont->name eq $self->name);
|
|
397 } $self->engine->get_relationships(@_);
|
|
398 }
|
|
399
|
|
400 =head2 get_predicate_terms
|
|
401
|
|
402 Title : get_predicate_terms
|
|
403 Usage : get_predicate_terms(): TermI[]
|
|
404 Function: Retrieves all relationship types.
|
|
405 Example :
|
|
406 Returns : Array of TermI objects
|
|
407 Args :
|
|
408
|
|
409
|
|
410 =cut
|
|
411
|
|
412 sub get_predicate_terms{
|
|
413 my $self = shift;
|
|
414 return grep { $_->ontology->name eq $self->name;
|
|
415 } $self->engine->get_predicate_terms(@_);
|
|
416 }
|
|
417
|
|
418 =head2 get_child_terms
|
|
419
|
|
420 Title : get_child_terms
|
|
421 Usage : get_child_terms(TermI term, TermI[] predicate_terms): TermI[]
|
|
422 Function: Retrieves all child terms of a given term, that satisfy a
|
|
423 relationship among those that are specified in the second
|
|
424 argument or undef otherwise. get_child_terms is a special
|
|
425 case of get_descendant_terms, limiting the search to the
|
|
426 direct descendants.
|
|
427
|
|
428 Note that a returned term may possibly be in another
|
|
429 ontology than this one, because the underlying engine may
|
|
430 manage multiple ontologies and the relationships of terms
|
|
431 between them. If you only want descendants within this
|
|
432 ontology, you need to filter the returned array.
|
|
433
|
|
434 Example :
|
|
435 Returns : Array of TermI objects.
|
|
436 Args : First argument is the term of interest, second is the list
|
|
437 of relationship type terms.
|
|
438
|
|
439
|
|
440 =cut
|
|
441
|
|
442 sub get_child_terms{
|
|
443 return shift->engine->get_child_terms(@_);
|
|
444 }
|
|
445
|
|
446 =head2 get_descendant_terms
|
|
447
|
|
448 Title : get_descendant_terms
|
|
449 Usage : get_descendant_terms(TermI term, TermI[] rel_types): TermI[]
|
|
450 Function: Retrieves all descendant terms of a given term, that
|
|
451 satisfy a relationship among those that are specified in
|
|
452 the second argument or undef otherwise.
|
|
453
|
|
454 Note that a returned term may possibly be in another
|
|
455 ontology than this one, because the underlying engine may
|
|
456 manage multiple ontologies and the relationships of terms
|
|
457 between them. If you only want descendants within this
|
|
458 ontology, you need to filter the returned array.
|
|
459
|
|
460 Example :
|
|
461 Returns : Array of TermI objects.
|
|
462 Args : First argument is the term of interest, second is the list
|
|
463 of relationship type terms.
|
|
464
|
|
465
|
|
466 =cut
|
|
467
|
|
468 sub get_descendant_terms{
|
|
469 return shift->engine->get_descendant_terms(@_);
|
|
470 }
|
|
471
|
|
472 =head2 get_parent_terms
|
|
473
|
|
474 Title : get_parent_terms
|
|
475 Usage : get_parent_terms(TermI term, TermI[] predicate_terms): TermI[]
|
|
476 Function: Retrieves all parent terms of a given term, that satisfy a
|
|
477 relationship among those that are specified in the second
|
|
478 argument or undef otherwise. get_parent_terms is a special
|
|
479 case of get_ancestor_terms, limiting the search to the
|
|
480 direct ancestors.
|
|
481
|
|
482 Note that a returned term may possibly be in another
|
|
483 ontology than this one, because the underlying engine may
|
|
484 manage multiple ontologies and the relationships of terms
|
|
485 between them. If you only want descendants within this
|
|
486 ontology, you need to filter the returned array.
|
|
487
|
|
488 Example :
|
|
489 Returns : Array of TermI objects.
|
|
490 Args : First argument is the term of interest, second is the list
|
|
491 of relationship type terms.
|
|
492
|
|
493
|
|
494 =cut
|
|
495
|
|
496 sub get_parent_terms{
|
|
497 return shift->engine->get_parent_terms(@_);
|
|
498 }
|
|
499
|
|
500 =head2 get_ancestor_terms
|
|
501
|
|
502 Title : get_ancestor_terms
|
|
503 Usage : get_ancestor_terms(TermI term, TermI[] predicate_terms): TermI[]
|
|
504 Function: Retrieves all ancestor terms of a given term, that satisfy
|
|
505 a relationship among those that are specified in the second
|
|
506 argument or undef otherwise.
|
|
507
|
|
508 Note that a returned term may possibly be in another
|
|
509 ontology than this one, because the underlying engine may
|
|
510 manage multiple ontologies and the relationships of terms
|
|
511 between them. If you only want descendants within this
|
|
512 ontology, you need to filter the returned array.
|
|
513
|
|
514 Example :
|
|
515 Returns : Array of TermI objects.
|
|
516 Args : First argument is the term of interest, second is the list
|
|
517 of relationship type terms.
|
|
518
|
|
519
|
|
520 =cut
|
|
521
|
|
522 sub get_ancestor_terms{
|
|
523 return shift->engine->get_ancestor_terms(@_);
|
|
524 }
|
|
525
|
|
526 =head2 get_leaf_terms
|
|
527
|
|
528 Title : get_leaf_terms
|
|
529 Usage : get_leaf_terms(): TermI[]
|
|
530 Function: Retrieves all leaf terms from the ontology. Leaf term is a
|
|
531 term w/o descendants.
|
|
532
|
|
533 Example : @leaf_terms = $obj->get_leaf_terms()
|
|
534 Returns : Array of TermI objects.
|
|
535 Args :
|
|
536
|
|
537
|
|
538 =cut
|
|
539
|
|
540 sub get_leaf_terms{
|
|
541 my $self = shift;
|
|
542 return grep { my $ont = $_->ontology;
|
|
543 # the first condition is a superset of the second, but
|
|
544 # we add it here for efficiency reasons, as many times
|
|
545 # it will short-cut to true and is supposedly faster than
|
|
546 # string comparison
|
|
547 ($ont == $self) || ($ont->name eq $self->name);
|
|
548 } $self->engine->get_leaf_terms(@_);
|
|
549 }
|
|
550
|
|
551 =head2 get_root_terms()
|
|
552
|
|
553 Title : get_root_terms
|
|
554 Usage : get_root_terms(): TermI[]
|
|
555 Function: Retrieves all root terms from the ontology. Root term is a
|
|
556 term w/o descendants.
|
|
557
|
|
558 Example : @root_terms = $obj->get_root_terms()
|
|
559 Returns : Array of TermI objects.
|
|
560 Args :
|
|
561
|
|
562
|
|
563 =cut
|
|
564
|
|
565 sub get_root_terms{
|
|
566 my $self = shift;
|
|
567 return grep { my $ont = $_->ontology;
|
|
568 # the first condition is a superset of the second, but
|
|
569 # we add it here for efficiency reasons, as many times
|
|
570 # it will short-cut to true and is supposedly faster than
|
|
571 # string comparison
|
|
572 ($ont == $self) || ($ont->name eq $self->name);
|
|
573 } $self->engine->get_root_terms(@_);
|
|
574 }
|
|
575
|
|
576 =head2 get_all_terms
|
|
577
|
|
578 Title : get_all_terms
|
|
579 Usage : get_all_terms: TermI[]
|
|
580 Function: Retrieves all terms from the ontology.
|
|
581
|
|
582 We do not mandate an order here in which the terms are
|
|
583 returned. In fact, the default implementation will return
|
|
584 them in unpredictable order.
|
|
585
|
|
586 Example : @terms = $obj->get_all_terms()
|
|
587 Returns : Array of TermI objects.
|
|
588 Args :
|
|
589
|
|
590
|
|
591 =cut
|
|
592
|
|
593 sub get_all_terms{
|
|
594 my $self = shift;
|
|
595 return grep { my $ont = $_->ontology;
|
|
596 # the first condition is a superset of the second, but
|
|
597 # we add it here for efficiency reasons, as many times
|
|
598 # it will short-cut to true and is supposedly faster than
|
|
599 # string comparison
|
|
600 ($ont == $self) || ($ont->name eq $self->name);
|
|
601 } $self->engine->get_all_terms(@_);
|
|
602 }
|
|
603
|
|
604 =head2 find_terms
|
|
605
|
|
606 Title : find_terms
|
|
607 Usage : ($term) = $oe->find_terms(-identifier => "SO:0000263");
|
|
608 Function: Find term instances matching queries for their attributes.
|
|
609
|
|
610 An implementation may not support querying for arbitrary
|
|
611 attributes, but can generally be expected to accept
|
|
612 -identifier and -name as queries. If both are provided,
|
|
613 they are implicitly intersected.
|
|
614
|
|
615 Example :
|
|
616 Returns : an array of zero or more Bio::Ontology::TermI objects
|
|
617 Args : Named parameters. The following parameters should be recognized
|
|
618 by any implementations:
|
|
619
|
|
620 -identifier query by the given identifier
|
|
621 -name query by the given name
|
|
622
|
|
623
|
|
624 =cut
|
|
625
|
|
626 sub find_terms{
|
|
627 my $self = shift;
|
|
628 return grep { $_->ontology->name eq $self->name;
|
|
629 } $self->engine->find_terms(@_);
|
|
630 }
|
|
631
|
|
632 =head1 Factory for relationships and terms
|
|
633
|
|
634 =cut
|
|
635
|
|
636 =head2 relationship_factory
|
|
637
|
|
638 Title : relationship_factory
|
|
639 Usage : $fact = $obj->relationship_factory()
|
|
640 Function: Get (and set, if the engine supports it) the object
|
|
641 factory to be used when relationship objects are created by
|
|
642 the implementation on-the-fly.
|
|
643
|
|
644 Example :
|
|
645 Returns : value of relationship_factory (a Bio::Factory::ObjectFactoryI
|
|
646 compliant object)
|
|
647 Args :
|
|
648
|
|
649
|
|
650 =cut
|
|
651
|
|
652 sub relationship_factory{
|
|
653 return shift->engine->relationship_factory(@_);
|
|
654 }
|
|
655
|
|
656 =head2 term_factory
|
|
657
|
|
658 Title : term_factory
|
|
659 Usage : $fact = $obj->term_factory()
|
|
660 Function: Get (and set, if the engine supports it) the object
|
|
661 factory to be used when term objects are created by
|
|
662 the implementation on-the-fly.
|
|
663
|
|
664 Example :
|
|
665 Returns : value of term_factory (a Bio::Factory::ObjectFactoryI
|
|
666 compliant object)
|
|
667 Args :
|
|
668
|
|
669
|
|
670 =cut
|
|
671
|
|
672 sub term_factory{
|
|
673 return shift->engine->term_factory(@_);
|
|
674 }
|
|
675
|
|
676
|
|
677 #################################################################
|
|
678 # aliases
|
|
679 #################################################################
|
|
680
|
|
681 *get_relationship_types = \&get_predicate_terms;
|
|
682
|
|
683 1;
|