[BioSQL-l] How to get a Seq object from Bio::DB::Persistent::Seq

Hilmar Lapp hlapp at gnf.org
Wed Jun 2 14:02:09 EDT 2004


On Jun 2, 2004, at 2:31 AM, Marc Logghe wrote:

> Hi Daniel,
>
>> I want to copy the object into a fresh seq object, to add new data and
>> store it afterwarts as a new entry with a different namespace.
>
> I don't know what will happen if you change the namespace of the  
> persistent object and store it. Probably a lot of constraints ;-) (Not  
> tested though !)
> A route you could follow is to
> 1. fetch the plain seq object

You don't really need to do this even.

> 2. change the namespace and add some features
> 3. make it persistent and
> 4. store it.
>

Right, that would be the way.

> suppose you have your persistent seq in $pseq;
> my $seq = $pseq->obj;
> $seq->namespace('my_new_namespace')
>

Again, no real reason to get the wrapped object unless you explicitly  
need a non-persistent object.

Persistent objects in bioperl-db speak are not tightly coupled to the  
database; in fact you might say they are uncoupled. What I mean is that  
you may change any attribute or property of the persistent object  
without having any effect on what is stored in the database. Only once  
you ask the object to store itself will it sync the changes to the  
database.

So, you may simply do the following:

	while (my $pseq = $query->next_object) {
		# e.g. change namespace
		$pseq->namespace("my namespace");
		# change other things, e.g., tack on another feature
		# (which may or may not be a persistent object)
		$pseq->add_SeqFeature($myfeature);
		# ...
		# when done making changes, sync to database
		$pseq->store();
	}

Note that this will update bioentries to change their namespace, not  
duplicate them in another namespace. If you wanted to duplicate a  
sequence in another namespace, possibly with some changes on the  
annotation, replace $pseq->store() with the following:

		...
		# trigger insert by making the object forget
		# its primary key
		$pseq->primary_key(undef);
		# we need to duplicate dependent objects
		# (children) too, like features
		foreach my $pfea ($pseq->get_SeqFeatures) {
			$pfea->primary_key(undef)
				if $pfea->isa("Bio::DB::PersistentObjectI");
			# features have locations
			$pfea->location->primary_key(undef)
				if $pfea->location->isa("Bio::DB::PersistentObjectI");
		}
		# do the insert
		$pseq->create();

You will note that this sample code actually does not cover all  
possible cases; e.g., if there are sub-features, or split locations.  
But you get the idea. Nevertheless, there is indeed a case for having a  
convenience method for de-persisting objects to better support those  
who want to duplicate them.

> # do some other stuff
>
> my $new_pseq = $db->create_persistent($seq);
> $new_pseq->create;
>

Note that this has problems associated as outlined above:

	- if you wanted to update the sequence, this would not do that
	- you will update the features though so that the original sequence  
won't have any features anymore (a feature has a foreign key to exactly  
one bioentry)

>>
>> Additionally, I'm quite confused by the mapping of bioperl objects to
>> biosql tables(e.g. for generating a Bio:Query with datacollections):
>> connections like bioenty<->seqI are obvious, but the rest?
>> Is there a something like a overview list of the object mapping?
> Have a look at  perldoc -m Bio::DB::BioSQL::BaseDriver, more precisely  
> at the %object_entity_map variable.
> Examples of queries you might find in  
> http://cvs.bioperl.org/cgi-bin/viewcvs/viewcvs.cgi/bioperl-db/t/ 
> query.t?rev=1.9&cvsroot=bioperl&content-type=text/vnd.viewcvs-markup
> and also the presentation given at BOSC2003:
> http://open-bio.org/bosc2003/slides/Persistent_Bioperl_BOSC03.pdf
>

Right. Thanks for helping Marc.

	-hilmar

-- 
-------------------------------------------------------------
Hilmar Lapp                            email: lapp at gnf.org
GNF, San Diego, Ca. 92121              phone: +1-858-812-1757
-------------------------------------------------------------



More information about the BioSQL-l mailing list