diff variant_effect_predictor/Bio/Ontology/SimpleOntologyEngine.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/variant_effect_predictor/Bio/Ontology/SimpleOntologyEngine.pm	Thu Apr 11 02:01:53 2013 -0400
@@ -0,0 +1,1050 @@
+# $Id: SimpleOntologyEngine.pm,v 1.3.2.5 2003/07/03 00:41:40 lapp Exp $
+#
+# BioPerl module for SimpleOntologyEngine
+#
+# Cared for by Peter Dimitrov <dimitrov@gnf.org>
+#
+# Copyright Peter Dimitrov
+# (c) Peter Dimitrov, dimitrov@gnf.org, 2002.
+# (c) GNF, Genomics Institute of the Novartis Research Foundation, 2002.
+#
+# You may distribute this module under the same terms as perl itself.
+# Refer to the Perl Artistic License (see the license accompanying this
+# software package, or see http://www.perl.com/language/misc/Artistic.html)
+# for the terms under which you may use, modify, and redistribute this module.
+#
+# THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+#
+# POD documentation - main docs before the code
+
+=head1 NAME
+
+SimpleOntologyEngine - Implementation of OntologyEngineI interface
+
+=head1 SYNOPSIS
+
+  my $soe = Bio::Ontology::SimpleOntologyEngine->new;
+
+
+=head1 DESCRIPTION
+
+This is a "simple" implementation of Bio::Ontology::OntologyEngineI.
+
+=head1 FEEDBACK
+
+=head2 Mailing Lists
+
+User feedback is an integral part of the evolution of this and other
+Bioperl modules. Send your comments and suggestions preferably to
+the Bioperl mailing list.  Your participation is much appreciated.
+
+  bioperl-l@bioperl.org              - General discussion
+  http://bioperl.org/MailList.shtml  - About the mailing lists
+
+=head2 Reporting Bugs
+
+Report bugs to the Bioperl bug tracking system to help us keep track
+of the bugs and their resolution. Bug reports can be submitted via
+email or the web:
+
+  bioperl-bugs@bioperl.org
+  http://bioperl.org/bioperl-bugs/
+
+=head1 AUTHOR - Peter Dimitrov
+
+Email dimitrov@gnf.org
+
+=head1 CONTRIBUTORS
+
+Hilmar Lapp, hlapp at gmx.net
+
+=head1 APPENDIX
+
+The rest of the documentation details each of the object methods.
+Internal methods are usually preceded with a _
+
+=cut
+
+
+# Let the code begin...
+
+
+package Bio::Ontology::SimpleOntologyEngine;
+use vars qw(@ISA);
+use strict;
+use Carp;
+use Bio::Root::Root;
+use Bio::Ontology::RelationshipFactory;
+use Bio::Ontology::OntologyEngineI;
+use Data::Dumper;
+
+@ISA = qw( Bio::Root::Root Bio::Ontology::OntologyEngineI );
+
+=head2 new
+
+ Title   : new
+ Usage   : $soe = Bio::Ontology::SimpleOntologyEngine->new;
+ Function: Initializes the ontology engine.
+ Example : $soe = Bio::Ontology::SimpleOntologyEngine->new;
+ Returns : Object of class SimpleOntologyEngine.
+ Args    :
+
+
+=cut
+
+sub new{
+  my ($class, @args) = @_;
+  my $self = $class->SUPER::new(@args);
+#   my %param = @args;
+
+  $self->_term_store( {} );
+  $self->_relationship_store( {} );
+  $self->_inverted_relationship_store( {} );
+  $self->_relationship_type_store( {} );
+  $self->_instantiated_terms_store( {} );
+
+  # set defaults for the factories
+  $self->relationship_factory(Bio::Ontology::RelationshipFactory->new(
+				     -type => "Bio::Ontology::Relationship"));
+  return $self;
+}
+
+=head2 _instantiated_terms_store
+
+ Title   : _instantiated_terms_store
+ Usage   : $obj->_instantiated_terms_store($newval)
+ Function:
+ Example :
+ Returns : hash
+ Args    : empty hash
+
+
+=cut
+
+sub _instantiated_terms_store{
+  my ($self, $value) = @_;
+
+  if( defined $value) {
+    $self->{'_instantiated_terms_store'} = $value;
+  }
+  return $self->{'_instantiated_terms_store'};
+}
+
+=head2 mark_instantiated
+
+ Title   : mark_instantiated
+ Usage   : $self->mark_instantiated(TermI[] terms): TermI[]
+ Function: Marks TermI objects as fully instantiated,
+  allowing for proper counting of the number of terms in the term store.
+The TermI objects has to be already stored in the term store in order to
+ be marked.
+ Example : $self->mark_instantiated($term);
+ Returns : its argument or throws an exception if a term is not
+  in the term store.
+ Args    : array of objects of class TermI.
+
+=cut
+
+sub mark_instantiated{
+  my ($self, @terms) = @_;
+
+  foreach my $term (@terms) {
+    $self->throw( "term ".$term->identifier." not in the term store\n" )
+      if !defined $self->_term_store->{$term->identifier};
+    $self->_instantiated_terms_store->{$term->identifier} = 1;
+  }
+
+  return @terms;
+}
+
+=head2 mark_uninstantiated
+
+ Title   : mark_uninstantiated
+ Usage   : $self->mark_uninstantiated(TermI[] terms): TermI[]
+ Function: Marks TermI objects as not fully instantiated,
+ Example : $self->mark_uninstantiated($term);
+ Returns : its argument or throws an exception if a term is not
+  in the term store(if the term is not marked it does nothing).
+ Args    : array of objects of class TermI.
+
+
+=cut
+
+sub mark_uninstantiated{
+  my ($self, @terms) = @_;
+
+  foreach my $term (@terms) {
+    $self->throw( "term ".$term->identifier." not in the term store\n" )
+      if !defined $self->_term_store->{$term->identifier};
+    delete $self->_instantiated_terms_store->{$term->identifier}
+      if defined $self->_instantiated_terms_store->{$term->identifier};
+  }
+
+  return @terms;
+}
+
+=head2 _term_store
+
+ Title   : term_store
+ Usage   : $obj->_term_store($newval)
+ Function:
+ Example :
+ Returns : reference to an array of Bio::Ontology::TermI objects
+ Args    : reference to an array of Bio::Ontology::TermI objects
+
+=cut
+
+sub _term_store{
+  my ($self, $value) = @_;
+
+  if( defined $value) {
+    if ( defined $self->{'_term_store'}) {
+      $self->throw("_term_store already defined\n");
+    }
+    else {
+      $self->{'_term_store'} = $value;
+    }
+  }
+
+  return $self->{'_term_store'};
+}
+
+=head2 add_term
+
+ Title   : add_term
+ Usage   : add_term(TermI term): TermI
+ Function: Adds TermI object to the ontology engine term store.
+ Marks the term fully instantiated by default.
+ Example : $soe->add_term($term)
+ Returns : its argument.
+ Args    : object of class TermI.
+
+=cut
+
+sub add_term{
+  my ($self, $term) = @_;
+  my $term_store = $self->_term_store;
+
+  if ( defined $term_store -> {$term->identifier}) {
+    $self->throw( "term ".$term->identifier." already defined\n" );
+  }
+  else {
+    $term_store->{$term->identifier} = $term;
+    $self->_instantiated_terms_store->{$term->identifier} = 1;
+  }
+
+  return $term;
+}
+
+=head2 get_term_by_identifier
+
+ Title   : get_term_by_identifier
+ Usage   : get_term_by_identifier(String[] id): TermI[]
+ Function: Retrieves terms from the term store by their identifier
+           field, or undef if not there.
+ Example : $term = $soe->get_term_by_identifier("IPR000001");
+ Returns : An array of zero or more Bio::Ontology::TermI objects.
+ Args    : An array of identifier strings
+
+
+=cut
+
+sub get_term_by_identifier{
+  my ($self, @ids) = @_;
+  my @ans = ();
+
+  foreach my $id (@ids) {
+      my $term = $self->_term_store->{$id};
+      push @ans, $term if defined $term;
+  }
+
+  return @ans;
+}
+
+=head2 _get_number_rels
+
+ Title   : get_number_rels
+ Usage   :
+ Function:
+ Example :
+ Returns : 
+ Args    :
+
+
+=cut
+
+sub _get_number_rels{
+  my ($self) = @_;
+  my $num_rels = 0;
+
+  foreach my $entry ($self->_relationship_store) {
+    $num_rels += scalar keys %$entry;
+  }
+  return $num_rels;
+}
+
+=head2 _get_number_terms
+
+ Title   : _get_number_terms
+ Usage   :
+ Function:
+ Example :
+ Returns : 
+ Args    :
+
+
+=cut
+
+sub _get_number_terms{
+  my ($self) = @_;
+
+  return scalar $self->_filter_unmarked( values %{$self->_term_store} );
+
+}
+
+=head2 _relationship_store
+
+ Title   : _storerelationship_store
+ Usage   : $obj->relationship_store($newval)
+ Function: 
+ Example : 
+ Returns : reference to an array of Bio::Ontology::TermI objects
+ Args    : reference to an array of Bio::Ontology::TermI objects
+
+
+=cut
+
+sub _relationship_store{
+  my ($self, $value) = @_;
+
+  if( defined $value) {
+    if ( defined $self->{'_relationship_store'}) {
+      $self->throw("_relationship_store already defined\n");
+    }
+    else {
+      $self->{'_relationship_store'} = $value;
+    }
+  }
+
+  return $self->{'_relationship_store'};
+}
+
+=head2 _inverted_relationship_store
+
+ Title   : _inverted_relationship_store
+ Usage   :
+ Function:
+ Example :
+ Returns : reference to an array of Bio::Ontology::TermI objects
+ Args    : reference to an array of Bio::Ontology::TermI objects
+
+
+=cut
+
+sub _inverted_relationship_store{
+  my ($self, $value) = @_;
+
+  if( defined $value) {
+    if ( defined $self->{'_inverted_relationship_store'}) {
+      $self->throw("_inverted_relationship_store already defined\n");
+    }
+    else {
+      $self->{'_inverted_relationship_store'} = $value;
+    }
+  }
+
+  return $self->{'_inverted_relationship_store'};
+}
+
+=head2 _relationship_type_store
+
+ Title   : _relationship_type_store
+ Usage   : $obj->_relationship_type_store($newval)
+ Function: 
+ Example : 
+ Returns : reference to an array of Bio::Ontology::RelationshipType objects
+ Args    : reference to an array of Bio::Ontology::RelationshipType objects
+
+
+=cut
+
+sub _relationship_type_store{
+  my ($self, $value) = @_;
+
+  if( defined $value) {
+    if ( defined $self->{'_relationship_type_store'}) {
+      $self->throw("_relationship_type_store already defined\n");
+    }
+    else {
+      $self->{'_relationship_type_store'} = $value;
+    }
+  }
+
+  return $self->{'_relationship_type_store'};
+}
+
+=head2 _add_relationship_simple
+
+ Title   : _add_relationship_simple
+ Usage   :
+ Function:
+ Example :
+ Returns : 
+ Args    :
+
+
+=cut
+
+sub _add_relationship_simple{
+   my ($self, $store, $rel, $inverted) = @_;
+   my $parent_id;
+   my $child_id;
+
+   if ($inverted) {
+     $parent_id = $rel->subject_term->identifier;
+     $child_id = $rel->object_term->identifier;
+   }
+   else {
+     $parent_id = $rel->object_term->identifier;
+     $child_id = $rel->subject_term->identifier;
+   }
+   if((defined $store->{$parent_id}->{$child_id}) &&
+      ($store->{$parent_id}->{$child_id}->name != $rel->predicate_term->name)){
+       $self->throw("relationship ".Dumper($rel->predicate_term).
+		    " between ".$parent_id." and ".$child_id.
+		    " already defined as ".
+		    Dumper($store->{$parent_id}->{$child_id})."\n");
+   }
+   else {
+     $store->{$parent_id}->{$child_id} = $rel->predicate_term;
+   }
+}
+
+=head2 add_relationship
+
+ Title   : add_relationship
+ Usage   : add_relationship(RelationshipI relationship): RelationshipI
+ Function: Adds a relationship object to the ontology engine.
+ Example :
+ Returns : Its argument.
+ Args    : A RelationshipI object.
+
+
+=cut
+
+sub add_relationship{
+   my ($self, $rel) = @_;
+
+   $self->_add_relationship_simple($self->_relationship_store,
+				   $rel, 0);
+   $self->_add_relationship_simple($self->_inverted_relationship_store,
+				   $rel, 1);
+   $self->_relationship_type_store->{
+       $self->_unique_termid($rel->predicate_term)} = $rel->predicate_term;
+
+   return $rel;
+}
+
+=head2 get_relationships
+
+ Title   : get_relationships
+ Usage   : get_relationships(): RelationshipI[]
+ Function: Retrieves all relationship objects.
+ Example :
+ Returns : Array of RelationshipI objects
+ Args    :
+
+
+=cut
+
+sub get_relationships{
+    my $self = shift;
+    my $term = shift;
+    my @rels;
+    my $store = $self->_relationship_store;
+    my $relfact = $self->relationship_factory(); 
+
+    my @parent_ids = $term ?
+	# if a term is supplied then only get the term's parents
+	(map { $_->identifier(); } $self->get_parent_terms($term)) :
+	# otherwise use all parent ids
+	(keys %{$store});
+    # add the term as a parent too if one is supplied
+    push(@parent_ids,$term->identifier) if $term;
+    
+    foreach my $parent_id (@parent_ids) {
+	my $parent_entry = $store->{$parent_id};
+
+	# if a term is supplied, add a relationship for the parent to the term
+	# except if the parent is the term itself (we added that one before)
+	if($term && ($parent_id ne $term->identifier())) {
+	    my $parent_term = $self->get_term_by_identifier($parent_id);
+	    push(@rels,
+		 $relfact->create_object(-object_term    => $parent_term,
+					 -subject_term   => $term,
+					 -predicate_term =>
+					    $parent_entry->{$term->identifier},
+					 -ontology       => $term->ontology()
+					 )
+		 );
+		 
+	} else {
+	    # otherwise, i.e., no term supplied, or the parent equals the
+	    # supplied term
+	    my $parent_term = $term ?
+		$term : $self->get_term_by_identifier($parent_id);
+	    foreach my $child_id (keys %$parent_entry) {
+		my $rel_info = $parent_entry->{$child_id};
+
+		push(@rels,
+		     $relfact->create_object(-object_term    => $parent_term,
+					     -subject_term   =>
+					         $self->get_term_by_identifier(
+							            $child_id),
+					     -predicate_term => $rel_info,
+					     -ontology =>$parent_term->ontology
+					     )
+		     );
+	    }
+	}
+    }
+
+    return @rels;
+}
+
+=head2 get_all_relationships
+
+ Title   : get_all_relationships
+ Usage   : get_all_relationships(): RelationshipI[]
+ Function: Retrieves all relationship objects.
+ Example :
+ Returns : Array of RelationshipI objects
+ Args    :
+
+
+=cut
+
+sub get_all_relationships{
+    return shift->get_relationships();
+}
+
+=head2 get_predicate_terms
+
+ Title   : get_predicate_terms
+ Usage   : get_predicate_terms(): TermI[]
+ Function: Retrives all relationship types stored in the engine
+ Example :
+ Returns : reference to an array of Bio::Ontology::RelationshipType objects
+ Args    :
+
+
+=cut
+
+sub get_predicate_terms{
+  my ($self) = @_;
+
+  return values %{$self->_relationship_type_store};
+}
+
+=head2 _is_rel_type
+
+ Title   : _is_rel_type
+ Usage   :
+ Function:
+ Example :
+ Returns : 
+ Args    :
+
+
+=cut
+
+sub _is_rel_type{
+  my ($self, $term, @rel_types) = @_;
+
+  foreach my $rel_type (@rel_types) {
+      if($rel_type->identifier || $term->identifier) {
+	  return 1 if $rel_type->identifier eq $term->identifier;
+      } else {
+	  return 1 if $rel_type->name eq $term->name;
+      }
+  }
+
+  return 0;
+}
+
+=head2 _typed_traversal
+
+ Title   : _typed_traversal
+ Usage   :
+ Function:
+ Example :
+ Returns :
+ Args    :
+
+
+=cut
+
+sub _typed_traversal{
+  my ($self, $rel_store, $level, $term_id, @rel_types) = @_;
+  return undef if !defined($rel_store->{$term_id});
+  my %parent_entry = %{$rel_store->{$term_id}};
+  my @children = keys %parent_entry;
+
+  my @ans;
+
+  if (@rel_types > 0) {
+    @ans = ();
+
+    foreach my $child_id (@children) {
+      push @ans, $child_id
+	  if $self->_is_rel_type( $rel_store->{$term_id}->{$child_id},
+				  @rel_types);
+    }
+  }
+  else {
+    @ans = @children;
+  }
+  if ($level < 1) {
+    my @ans1 = ();
+
+    foreach my $child_id (@ans) {
+      push @ans1, $self->_typed_traversal($rel_store,
+					  $level - 1, $child_id, @rel_types)
+	if defined $rel_store->{$child_id};
+    }
+    push @ans, @ans1;
+  }
+
+  return @ans;
+}
+
+=head2 get_child_terms
+
+ Title   : get_child_terms
+ Usage   : get_child_terms(TermI term, TermI[] predicate_terms): TermI[]
+  get_child_terms(TermI term, RelationshipType[] predicate_terms): TermI[]
+ Function: Retrieves all child terms of a given term, that satisfy a
+           relationship among those that are specified in the second
+           argument or undef otherwise. get_child_terms is a special
+           case of get_descendant_terms, limiting the search to the
+           direct descendants.
+
+ Example :
+ Returns : Array of TermI objects.
+ Args    : First argument is the term of interest, second is the list of relationship type terms.
+
+
+=cut
+
+sub get_child_terms{
+    my ($self, $term, @relationship_types) = @_;
+
+    $self->throw("must provide TermI compliant object") 
+	unless defined($term) && $term->isa("Bio::Ontology::TermI");
+
+    return $self->_filter_unmarked(
+               $self->get_term_by_identifier(
+		   $self->_typed_traversal($self->_relationship_store,
+					   1,
+					   $term->identifier,
+					   @relationship_types) ) );
+}
+
+=head2 get_descendant_terms
+
+ Title   : get_descendant_terms
+ Usage   : get_descendant_terms(TermI term, TermI[] rel_types): TermI[]
+  get_child_terms(TermI term, RelationshipType[] predicate_terms): TermI[]
+ Function: Retrieves all descendant terms of a given term, that
+           satisfy a relationship among those that are specified in
+           the second argument or undef otherwise. Uses
+           _typed_traversal to find all descendants.
+
+ Example :
+ Returns : Array of TermI objects.
+ Args    : First argument is the term of interest, second is the list of relationship type terms.
+
+
+=cut
+
+sub get_descendant_terms{
+  my ($self, $term, @relationship_types) = @_;
+
+  $self->throw("must provide TermI compliant object") 
+      unless defined($term) && $term->isa("Bio::Ontology::TermI");
+
+  return $self->_filter_unmarked(
+	     $self->_filter_repeated(
+	         $self->get_term_by_identifier(
+		     $self->_typed_traversal($self->_relationship_store,
+					     0,
+					     $term->identifier,
+					     @relationship_types) ) ) );
+}
+
+=head2 get_parent_terms
+
+ Title   : get_parent_terms
+ Usage   : get_parent_terms(TermI term, TermI[] predicate_terms): TermI[]
+  get_child_terms(TermI term, RelationshipType[] predicate_terms): TermI[]
+ Function: Retrieves all parent terms of a given term, that satisfy a
+           relationship among those that are specified in the second
+           argument or undef otherwise. get_parent_terms is a special
+           case of get_ancestor_terms, limiting the search to the
+           direct ancestors.
+
+ Example :
+ Returns : Array of TermI objects.
+ Args    : First argument is the term of interest, second is the list of relationship type terms.
+
+
+=cut
+
+sub get_parent_terms{
+  my ($self, $term, @relationship_types) = @_;
+  $self->throw("term must be a valid object, not undef") unless defined $term;
+
+  return $self->_filter_unmarked(
+	    $self->get_term_by_identifier(
+		$self->_typed_traversal($self->_inverted_relationship_store,
+					1,
+					$term->identifier,
+					@relationship_types) ) );
+}
+
+=head2 get_ancestor_terms
+
+ Title   : get_ancestor_terms
+ Usage   : get_ancestor_terms(TermI term, TermI[] predicate_terms): TermI[]
+  get_child_terms(TermI term, RelationshipType[] predicate_terms): TermI[]
+ Function: Retrieves all ancestor terms of a given term, that satisfy
+           a relationship among those that are specified in the second
+           argument or undef otherwise. Uses _typed_traversal to find
+           all ancestors.
+
+ Example :
+ Returns : Array of TermI objects.
+ Args    : First argument is the term of interest, second is the list
+           of relationship type terms.
+
+
+=cut
+
+sub get_ancestor_terms{
+  my ($self, $term, @relationship_types) = @_;
+  $self->throw("term must be a valid object, not undef") unless defined $term;
+
+  return $self->_filter_unmarked(
+	    $self->_filter_repeated(
+               $self->get_term_by_identifier(
+                  $self->_typed_traversal($self->_inverted_relationship_store,
+					  0,
+					  $term->identifier,
+					  @relationship_types) ) ) );
+}
+
+=head2 get_leaf_terms
+
+ Title   : get_leaf_terms
+ Usage   : get_leaf_terms(): TermI[]
+ Function: Retrieves all leaf terms from the ontology. Leaf term is a term w/o descendants.
+ Example : @leaf_terms = $obj->get_leaf_terms()
+ Returns : Array of TermI objects.
+ Args    :
+
+
+=cut
+
+sub get_leaf_terms{
+  my ($self) = @_;
+  my @leaf_terms;
+
+  foreach my $term (values %{$self->_term_store}) {
+    push @leaf_terms, $term
+      if !defined $self->_relationship_store->{$term->identifier} &&
+	defined $self->_instantiated_terms_store->{$term->identifier};
+  }
+
+  return @leaf_terms;
+}
+
+=head2 get_root_terms
+
+ Title   : get_root_terms
+ Usage   : get_root_terms(): TermI[]
+ Function: Retrieves all root terms from the ontology. Root term is a term w/o descendants.
+ Example : @root_terms = $obj->get_root_terms()
+ Returns : Array of TermI objects.
+ Args    :
+
+
+=cut
+
+sub get_root_terms{
+  my ($self) = @_;
+  my @root_terms;
+
+  foreach my $term (values %{$self->_term_store}) {
+    push @root_terms, $term
+      if !defined $self->_inverted_relationship_store->{$term->identifier} &&
+	defined $self->_instantiated_terms_store->{$term->identifier};
+  }
+
+  return @root_terms;
+}
+
+=head2 _filter_repeated
+
+ Title   : _filter_repeated
+ Usage   : @lst = $self->_filter_repeated(@old_lst);
+ Function: Removes repeated terms
+ Example :
+ Returns : List of unique TermI objects
+ Args    : List of TermI objects
+
+
+=cut
+
+sub _filter_repeated{
+  my ($self, @args) = @_;
+  my %h;
+
+  foreach my $element (@args) {
+    $h{$element->identifier} = $element if !defined $h{$element->identifier};
+  }
+
+  return values %h;
+}
+
+=head2 get_all_terms
+
+ Title   : get_all_terms
+ Usage   : get_all_terms(): TermI[]
+ Function: Retrieves all terms currently stored in the ontology.
+ Example : @all_terms = $obj->get_all_terms()
+ Returns : Array of TermI objects.
+ Args    :
+
+
+=cut
+
+sub get_all_terms{
+  my ($self) = @_;
+
+  return $self->_filter_unmarked( values %{$self->_term_store} );
+}
+
+=head2 find_terms
+
+ Title   : find_terms
+ Usage   : ($term) = $oe->find_terms(-identifier => "SO:0000263");
+ Function: Find term instances matching queries for their attributes.
+
+           This implementation can efficiently resolve queries by
+           identifier.
+
+ Example :
+ Returns : an array of zero or more Bio::Ontology::TermI objects
+ Args    : Named parameters. The following parameters should be recognized
+           by any implementations:
+
+              -identifier    query by the given identifier
+              -name          query by the given name
+
+
+=cut
+
+sub find_terms{
+    my ($self,@args) = @_;
+    my @terms;
+
+    my ($id,$name) = $self->_rearrange([qw(IDENTIFIER NAME)],@args);
+
+    if(defined($id)) {
+	@terms = $self->get_term_by_identifier($id);
+    } else {
+	@terms = $self->get_all_terms();
+    }
+    if(defined($name)) {
+	@terms = grep { $_->name() eq $name; } @terms;
+    }
+    return @terms;
+}
+
+
+=head2 relationship_factory
+
+ Title   : relationship_factory
+ Usage   : $fact = $obj->relationship_factory()
+ Function: Get/set the object factory to be used when relationship
+           objects are created by the implementation on-the-fly.
+
+ Example : 
+ Returns : value of relationship_factory (a Bio::Factory::ObjectFactoryI
+           compliant object)
+ Args    : on set, a Bio::Factory::ObjectFactoryI compliant object
+
+
+=cut
+
+sub relationship_factory{
+    my $self = shift;
+
+    return $self->{'relationship_factory'} = shift if @_;
+    return $self->{'relationship_factory'};
+}
+
+=head2 term_factory
+
+ Title   : term_factory
+ Usage   : $fact = $obj->term_factory()
+ Function: Get/set the object factory to be used when term objects are
+           created by the implementation on-the-fly.
+
+           Note that this ontology engine implementation does not
+           create term objects on the fly, and therefore setting this
+           attribute is meaningless.
+
+ Example : 
+ Returns : value of term_factory (a Bio::Factory::ObjectFactoryI
+           compliant object)
+ Args    : on set, a Bio::Factory::ObjectFactoryI compliant object
+
+
+=cut
+
+sub term_factory{
+    my $self = shift;
+
+    if(@_) {
+	$self->warn("setting term factory, but ".ref($self).
+		    " does not create terms on-the-fly");
+	return $self->{'term_factory'} = shift;
+    }
+    return $self->{'term_factory'};
+}
+
+=head2 _filter_unmarked
+
+ Title   : _filter_unmarked
+ Usage   : _filter_unmarked(TermI[] terms): TermI[]
+ Function: Removes the uninstantiated terms from the list of terms
+ Example :
+ Returns : array of fully instantiated TermI objects
+ Args    : array of TermI objects
+
+
+=cut
+
+sub _filter_unmarked{
+  my ($self, @terms) = @_;
+  my @filtered_terms = ();
+
+  if ( scalar(@terms) >= 1) {
+    foreach my $term (@terms) {
+      push @filtered_terms, $term
+	if defined $self->_instantiated_terms_store->{$term->identifier};
+    }
+  }
+
+  return @filtered_terms;
+}
+
+=head2 remove_term_by_id
+
+ Title   : remove_term_by_id
+ Usage   : remove_term_by_id(String id): TermI
+ Function: Removes TermI object from the ontology engine using the
+           string id as an identifier. Current implementation does not
+           enforce consistency of the relationships using that term.
+ Example : $term = $soe->remove_term_by_id($id);
+ Returns : Object of class TermI or undef if not found.
+ Args    : The string identifier of a term.
+
+
+=cut
+
+sub remove_term_by_id{
+  my ($self, $id) = @_;
+
+  if ( $self->get_term_by_identifier($id) ) {
+    my $term = $self->{_term_store}->{$id};
+    delete $self->{_term_store}->{$id};
+    return $term;
+  }
+  else {
+    $self->warn("Term with id '$id' is not in the term store");
+    return undef;
+  }
+}
+
+=head2 to_string
+
+ Title   : to_string
+ Usage   : print $sv->to_string();
+ Function: Currently returns formatted string containing the number of
+           terms and number of relationships from the ontology engine.
+ Example : print $sv->to_string();
+ Returns :
+ Args    :
+
+
+=cut
+
+sub to_string{
+  my ($self) = @_;
+  my $s = "";
+
+  $s .= "-- # Terms:\n";
+  $s .= scalar($self->get_all_terms)."\n";
+  $s .= "-- # Relationships:\n";
+  $s .= $self->_get_number_rels."\n";
+
+  return $s;
+}
+
+=head2 _unique_termid
+
+ Title   : _unique_termid
+ Usage   :
+ Function: Returns a string that can be used as ID using fail-over
+           approaches. 
+
+           If the identifier attribute is not set, it uses the
+           combination of name and ontology name, provided both are
+           set. If they aren't, it returns the name alone.
+
+           Note that this is a private method. Call from inheriting
+           classes but not from outside.
+
+ Example :
+ Returns : a string
+ Args    : a Bio::Ontology::TermI compliant object
+
+
+=cut
+
+sub _unique_termid{
+    my $self = shift;
+    my $term = shift;
+
+    return $term->identifier() if $term->identifier();
+    my $id = $term->ontology->name() if $term->ontology();
+    if($id) { 
+	$id .= '|'; 
+    } else { 
+	$id = ''; 
+    }
+    $id .= $term->name();
+}
+
+
+#################################################################
+# aliases
+#################################################################
+
+*get_relationship_types = \&get_predicate_terms;
+
+1;