[Bioperl-l] how to use BioQuery

Hilmar Lapp hlapp at gnf.org
Mon Jun 9 02:53:18 EDT 2003

On Sunday, June 8, 2003, at 08:27  PM, Juguang Xiao wrote:

>> How to use BioQuery is the most undocumented piece of the story.  
>> t/query.t is probably the single most useful place to get a grasp of  
>> what the ideas are. It may also be useful to check in the  
>> Bio/DB/BioSQL directory for adaptors that implement (i.e., override)  
>> attach_children() and attach_foreign_key_objects() to how to find  
>> objects by foreign key or by association.
> In which module the mapping from bioperl module name, say Bio::SeqI,  
> to schema table name, bioentry (I guess) is defined?

The base object-relational mapping is in Bio/DB/BioSQL/BaseDriver.pm,  
right at the top of the code. Note that the RDBMS-specific drivers may  
override it in Bio/DB/BioSQL/<driver>/BasePersistenceAdaptorDriver.pm.  
Currently, the one for Oracle does this.

>> Also, the mapping and translation code in BioQuery.pm is not very  
>> robust. I had to write it in a crunch and have since never found the  
>> time to rewrite it such that it becomes at least remotely  
>> comprehensible. There may be lots of bugs lurking, as it is not  
>> really tested beyond what t/query.t and the adaptors test.
> I have the similar sick code to use BioQuery. Can dear doctor help to  
> diagnose it? :-) Thanks.
> The scripts:
> use Bio::DB::BioDB;
> my $db = Bio::DB::BioDB->new(
>     -database => 'biosql',
>     -host => 'mysql-dev',
>     -dbname => 'juguang_biosql_embl',
>     -driver => 'mysql',
>     -user => 'root'
> );
> use Bio::DB::Query::BioQuery;
> my $query = Bio::DB::Query::BioQuery->new(
>     -datacollections => [
>         'Bio::SeqI seq', 'Bio::Species=>Bio::SeqI sp'],
>     -where => ['sp.name like ?']

You need to use object slots here, not relational table columns. The  
mapper will deduce the latter. I.e., what you want to use here is  
sp.binomial (as defined in Bio::Species), not sp.name (Bio::Species  
doesn't have a slot named 'name').

The problem here is that if you want to query for 'house mouse', it is  
not a binomial (i.e., scientific name), but the common name. So you'd  
actually have to use 'sp.common_name'. The problem with this is that in  
the biosql taxon model this is now not just another column in the same  
table, but necessitates a different constraint on  
taxon_name.name_class. You cannot map this nicely back and forth  
between object and relational model, because Bio::Species is  
incompatible with the biosql taxon tables.

This problem may go away once Bio::Taxonomy gets fully stable and  
eventually replaces Bio::Species. In the meantime, you need to work  
with a kludge:

	-where => ["sp.binomial like ?", "sp.name_class = 'common name'"]

Be careful though to remove the second condition (or replace with  
'scientific name') if you want to search by scientific name.

Hth, -hilmar

> );
> my $seq_adaptor = $db->get_object_adaptor('Bio::SeqI');
> my $result = $seq_adaptor->find_by_query($query,
>     -values => ['house mouse']
> );
> while(my $seq = $result->next_object){
>     print ref($seq) ."\n";
> }
> ######################################
> The error message:
> ------------- EXCEPTION  -------------
> MSG: slot 'name' not mapped to column for table taxon_name
> STACK Bio::DB::Query::BioQuery::_map_slot_to_col  
> /Home_R1/juguang/src/bioperl-db//Bio/DB/Query/BioQuery.pm:487
> STACK Bio::DB::Query::BioQuery::_map_constraint_slots_to_columns  
> /Home_R1/juguang/src/bioperl-db//Bio/DB/Query/BioQuery.pm:369
> STACK Bio::DB::Query::BioQuery::translate_query  
> /Home_R1/juguang/src/bioperl-db//Bio/DB/Query/BioQuery.pm:305
> STACK Bio::DB::BioSQL::BaseDriver::translate_query  
> /Home_R1/juguang/src/bioperl-db//Bio/DB/BioSQL/BaseDriver.pm:1097
> STACK Bio::DB::BioSQL::BasePersistenceAdaptor::find_by_query  
> /Home_R1/juguang/src/bioperl-db//Bio/DB/BioSQL/ 
> BasePersistenceAdaptor.pm:1154
> STACK toplevel find_by_species.pl:22
> Juguang
Hilmar Lapp                            email: lapp at gnf.org
GNF, San Diego, Ca. 92121              phone: +1-858-812-1757

More information about the Bioperl-l mailing list