#----------------------------------------------------------------- # MOBY::RDF::Ontologies::Namespaces # Author: Edward Kawas , # For copyright and disclaimer see below. # # $Id: Namespaces.pm,v 1.7 2008/09/02 13:12:46 kawas Exp $ #----------------------------------------------------------------- package MOBY::RDF::Ontologies::Namespaces; use RDF::Core; use RDF::Core::Storage::Memory; use RDF::Core::Model; use RDF::Core::Literal; use RDF::Core::Statement; use RDF::Core::Model::Serializer; use RDF::Core::NodeFactory; use MOBY::Config; use MOBY::RDF::Predicates::DC_PROTEGE; use MOBY::RDF::Predicates::MOBY_PREDICATES; use MOBY::RDF::Predicates::OMG_LSID; use MOBY::RDF::Predicates::RDF; use MOBY::RDF::Predicates::RDFS; use MOBY::RDF::Utils; use strict; use vars qw /$VERSION/; $VERSION = sprintf "%d.%02d", q$Revision: 1.7 $ =~ /: (\d+)\.(\d+)/; #----------------------------------------------------------------- # load all modules needed for my attributes #----------------------------------------------------------------- =head1 NAME MOBY::RDF::Ontologies::Namespaces - Create RDF/OWL for Moby =head1 SYNOPSIS use MOBY::RDF::Ontologies::Namespaces; # iustantiate my $x = MOBY::RDF::Ontologies::Namespaces->new; # get all ontology terms in unformatted XML print $x->createAll({ prettyPrint => 'no' }); # get a specific ontology term in 'pretty print XML' print $x->createByName({term => 'NCBI_gi' }); =head1 DESCRIPTION This module creates RDF XML for the Namespace ontology =cut =head1 AUTHORS Edward Kawas (edward.kawas [at] gmail [dot] com) =cut #----------------------------------------------------------------- =head1 SUBROUTINES =cut #----------------------------------------------------------------- # new #----------------------------------------------------------------- sub new { my ($class) = @_; # create an object my $self = bless {}, ref($class) || $class; # save some information retrieved from mobycentral.config my $CONF = MOBY::Config->new; $self->{uri} = $CONF->{mobynamespace}->{resourceURL} || 'http://biomoby.org/RESOURCES/MOBY-S/Namespaces#'; $self->{uri} = $self->{uri} . "#" unless $self->{uri} =~ m/^.*(\#{1})$/; $self->{query_all} = <{query} = <{prettyPrint} ? $hash->{prettyPrint} : 'yes'; # set up an RDF model my $storage = new RDF::Core::Storage::Memory; my $model = new RDF::Core::Model( Storage => $storage ); # add root of ontology { my $resource = new RDF::Core::Resource( $self->{uri}, "Namespace" ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::RDFS->label ), new RDF::Core::Literal("Namespace") ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::RDFS->comment ), new RDF::Core::Literal( "a base namespace identifier, never instantiated" ) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->publisher ), new RDF::Core::Literal("openinformatics.com") ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->identifier ), new RDF::Core::Literal( "urn:lsid:biomoby.org:namespacetype:Namespace" ) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->creator ), new RDF::Core::Literal("markw\@illuminae.com") ) ); } my $db = MOBY::Config->new()-> getDataAdaptor( source => "mobynamespace" )->dbh; my $sth = $db->prepare( $self->{query_all} ); $sth->execute; # returns an array of hash references while ( my $ref = $sth->fetchrow_arrayref ) { my $subject = $$ref[0]; my $description = $$ref[1]; my $lsid = $$ref[2]; my $authority = $$ref[3]; my $email = $$ref[4]; my $resource = new RDF::Core::Resource( $self->{uri}, $subject ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::RDFS->label ), new RDF::Core::Literal($subject) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::RDFS->comment ), new RDF::Core::Literal($description) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->publisher ), new RDF::Core::Literal($authority) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->identifier ), new RDF::Core::Literal($lsid) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->creator ), new RDF::Core::Literal($email) ) ); # add subclassof, if applicable my $parent = new RDF::Core::Resource( $self->{uri}, 'Namespace' ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::RDFS->subClassOf ), $parent ) ); } $sth->finish(); $db->disconnect(); my $xml = ''; my $serializer = new RDF::Core::Model::Serializer( Model => $model, Output => \$xml, BaseURI => 'URI://BASE/', ); $serializer->serialize; return new MOBY::RDF::Utils->prettyPrintXML( { xml => $xml } ) unless $prettyPrint eq 'no'; return $xml; } =head2 createByName Returns RDF XML for a specific node in the Namespace ontology as a pretty printed String of XML. This routine consumes a hash as input with keys: term: the node to retrieve B prettyPrint: whether (yes) or not (no) to output formatted XML. Defaults to 'yes'. =cut sub createByName { my ( $self, $hash ) = @_; die "No term specified!" unless $hash->{term}; # set up the term that we care about my $term = $hash->{term}; my $prettyPrint = $hash->{prettyPrint} ? $hash->{prettyPrint} : 'yes'; my $termExists = 0; #special case where term == Namespace $termExists = $termExists + 1 if $term eq 'Namespace'; # set up an RDF model my $storage = new RDF::Core::Storage::Memory; my $model = new RDF::Core::Model( Storage => $storage ); # add root of ontology { my $resource = new RDF::Core::Resource( $self->{uri}, "Namespace" ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::RDFS->label ), new RDF::Core::Literal("Namespace") ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::RDFS->comment ), new RDF::Core::Literal( "a base namespace identifier, never instantiated" ) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->publisher ), new RDF::Core::Literal("openinformatics.com") ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->identifier ), new RDF::Core::Literal( "urn:lsid:biomoby.org:namespacetype:Namespace" ) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->creator ), new RDF::Core::Literal("markw\@illuminae.com") ) ); } my $node_factory = new RDF::Core::NodeFactory(); do { my $db = MOBY::Config->new()-> getDataAdaptor( source => "mobynamespace" )->dbh; my $sth = $db->prepare( $self->{query} ); $sth->execute( ($term) ); $term = ''; #base case $term = '' if $term eq 'Namespace'; # returns an array of hash references while ( my $ref = $sth->fetchrow_arrayref ) { $termExists++; my $subject = $$ref[0]; my $description = $$ref[1]; my $lsid = $$ref[2]; my $authority = $$ref[3]; my $email = $$ref[4]; my $resource = new RDF::Core::Resource( $self->{uri}, $subject ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::RDFS->label ), new RDF::Core::Literal($subject) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::RDFS->comment ), new RDF::Core::Literal($description) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->publisher ), new RDF::Core::Literal($authority) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->identifier ), new RDF::Core::Literal($lsid) ) ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::DC_PROTEGE->creator ), new RDF::Core::Literal($email) ) ); # add subclassof, my $parent = new RDF::Core::Resource( $self->{uri}, 'Namespace' ); $model->addStmt( new RDF::Core::Statement( $resource, $resource->new( MOBY::RDF::Predicates::RDFS->subClassOf ), $parent ) ); } $sth->finish(); $db->disconnect(); } while ( $term && $term ne '' ); my $xml = ''; my $serializer = new RDF::Core::Model::Serializer( Model => $model, Output => \$xml, BaseURI => 'URI://BASE/', ); $serializer->serialize; # dont output anything unless term exists! unless ( $termExists > 0 ) { $xml = < END } return new MOBY::RDF::Utils->prettyPrintXML( { xml => $xml } ) unless $prettyPrint eq 'no'; return $xml; } 1; __END__