ExtractMappings

From NCBO Wiki
Jump to navigation Jump to search

Extract Mappings - Sample code

#!/usr/bin/perl

#############################################################
# DESCRIPTION: Code to extract mapping data from 
# BioPortal(http://bioportal.bioontology.org). 
#
# NOTE: The Web services used in this code are prototype
# services and will change. Subscribe to the bioportal-announce
# mailing list (https://mailman.stanford.edu/mailman/listinfo/bioportal-announce)
# to be notified of changes in this Web service. 
#
# USAGE: perl extract_mappings.pl > outputfile.txt
#
# AUTHOR: Trish Whetzel (support@bioontology.org)
# DATE: Tue Oct 27 18:55:06 PDT 2009
#############################################################

use LWP::UserAgent;
use XML::LibXML;
use strict;
use warnings;

# Declare variables
my ($ontology_id, $term_id, $term, $ontology, $dest_ontology_id, $dest_ontology, $dest_term_id, $dest_term, $user_id);

# Main method
get_mappings();

# Subroutines
sub get_mappings {
	my $ua = new LWP::UserAgent;

	# make request
	# NOTE: ontology id is hard-coded, the ontology id can be found from the web interface ontology metadata page or 
	# the web service http://rest.bioontology.org/bioportal/ontologies?email=example@example.org
	my $req =  new HTTP::Request GET => 'http://bioportal.bioontology.org/mappings/service/1430/?email=bioportal-mapping';  #1023
	$req->content_type('application/x-www-form-urlencoded');

	# send request and get response.
	my $res = $ua->request($req);

	# If you want to get a large result. It is better to write to a file directly.
	# my $res = $ua->request($req,'file_name.txt');

	# Check the outcome of the response
	if ( $res->is_success ) {
		print STDERR "Call successful\n";

		# read XML file
		my $parser = XML::LibXML->new();
		my $xml = $parser->parse_string( $res->decoded_content );
		my $num_of_responses = 0;	

		# print output
		foreach my $mappingBlock ( $xml->findnodes('hash/mapping-from/mapping-from') ) {
			my ($source) = $mappingBlock->findnodes('./source-ont');
			my ($ontology_name) = $mappingBlock->findnodes('./source-ont-name');
			my ($source_id) = $mappingBlock->findnodes('./source-id');
			my ($source_name) = $mappingBlock->findnodes('./source-name');
			
			my ($id) = $mappingBlock->findnodes('./user-id');
			
			my ($dest_ont) = $mappingBlock->findnodes('./destination-ont');
			my ($dest_ontology_name) = $mappingBlock->findnodes('./destination-ont-name');
			my ($dest_source_id) = $mappingBlock->findnodes('./destination-id');
			my ($dest_source_name) = $mappingBlock->findnodes('./destination-name');
			
			$ontology_id = $source->to_literal;
			$ontology = $ontology_name->to_literal;
			$term_id = $source_id->to_literal;
			$term = $source_name->to_literal;
			
			$user_id = $id->to_literal;
			
			$dest_ontology_id = $dest_ont->to_literal;
			$dest_ontology = $dest_ontology_name->to_literal;
			$dest_term_id = $dest_source_id->to_literal;
			$dest_term = $dest_source_name->to_literal;
			
			#add line to check if mapping is to a specific ontology
			my $ontology_id_of_interest = '1341'; 
			my $user_of_interest = '';
			
			if ($dest_ontology_id == $ontology_id_of_interest) { #} && $user_id == $user_of_interest) {  #use for mapping-from
			#if ($ontology_id == $ontology_id_of_interest && $user_id == $user_of_interest) { #use for mapping-to
				$num_of_responses++;
				print ("$num_of_responses: S: $ontology_id, D: $dest_ontology_id; S: $ontology, D: $dest_ontology; S: $term_id, D: $dest_term_id; S: $term, D: $dest_term \n");
			}
			# For testing script
			else {
				#print STDERR ("**Not mapped to ontol of interest: $ontology_id_of_interest\t - $ontology_id, $ontology, $term_id, $term, $dest_ontology_id, $dest_ontology, $dest_term_id, $dest_term \n");
			}
		}
	}
}