GOBO

 view release on metacpan or  search on metacpan

GOBO/Parsers/OBOParser.pm  view on Meta::CPAN

				my $rn = $g->relation_noderef($1);
				#my $tn = $g->term_noderef($2);
				my $tn = $self->getnode($2, $stanzaclass eq 'typedef' ? 'r' : 'c');
				#my $tn = $stanzaclass eq 'typedef' ? $g->relation_noderef($2) : $g->term_noderef($2);
				my $s = new GOBO::LinkStatement(node=>$n,relation=>$rn,target=>$tn, is_intersection=>1);
				$g->add_link($s);
			}
			elsif (/^intersection_of:\s*(\S+)/) {
				#my $tn = $g->term_noderef($1);
				#my $tn = $stanzaclass eq 'typedef' ? $g->relation_noderef($1) : $g->term_noderef($1);
				my $tn = $self->getnode($1, $stanzaclass eq 'typedef' ? 'r' : 'c');
				my $s = new GOBO::LinkStatement(node=>$n,relation=>'is_a',target=>$tn, is_intersection=>1);
				$g->add_link($s);
			}
			else {
				$self->throw("badly formatted intersection: $_");
			}
		}
		elsif (/^union_of:\s*(\S+)/) {
			my $u = $self->getnode($1, $stanzaclass eq 'typedef' ? 'r' : 'c');
			my $ud = $n->union_definition;
			if (!$ud) {
				$ud = new GOBO::ClassExpression::Union;
				$n->union_definition($ud);
			}
			$ud->add_argument($u);
		}
		elsif (/^is_(\w+):\s*(\w+)/) {
			my $att = $1;
			$n->$att(1) if $2 eq 'true';
			#$n->{$att} = $val; # TODO : check
		}
		elsif (/^transitive_over:\s*(\w+)/) {
			my $rn = $g->relation_noderef($1);
			$n->transitive_over($rn);
		}
		elsif (/^(holds_over_chain|equivalent_to_chain):\s*(.*)/) {
			my $ct = $1;
			my @rels  = map { $self->getnode($_,'r') } split(' ',$2);
			$ct eq 'holds_over_chain' ? $n->add_holds_over_chain(\@rels) : $n->add_equivalent_to_chain(\@rels);
		}
		# following for annotation stanzas only
		elsif (/^subject:\s*(.*)/) {
			$n->node($self->getnode($1));
		}
		elsif (/^relation:\s*(.*)/) {
			$n->relation($self->getnode($1,'r'));
		}
		elsif (/^object:\s*(.*)/) {
			$n->target($self->getnode($1));
		}
		elsif (/^description:\s*(.*)/) {
			$n->description($1);
		}
		elsif (/^source:\s*(.*)/) {
			$n->provenance($self->getnode($1));
		}
		elsif (/^assigned_by:\s*(.*)/) {
			$n->source($self->getnode($1));
		}
		elsif (/^formula:\s*(.*)/) {
			_parse_vals($1,$vals);
			my $f = new GOBO::Formula(text=>$vals->[0],
									  language=>$vals->[1]);
			$f->associated_with($n);
			$g->add_formula($f);
		}
		else {
#			warn "ignored: $_";
			# ...
		}
	}
	if (@anns) {
		$g->add_annotations(\@anns);
	}
	return;
}



sub getnode {
	my $self = shift;
	my $id = shift;
	my $metatype = shift || '';
	my $g = $self->graph;
	my $n;
	if ($metatype eq 'c') {
		$n = $g->term_noderef($id);
	}
	elsif ($metatype eq 'r') {
		$n = $g->relation_noderef($id);
	}
	elsif ($metatype eq 'i') {
		$n = $g->instance_noderef($id);
	}
	else {
		$n = $g->noderef($id);
	}
	return $n;
}

sub add_metadata {
	my $self = shift;
	my $s = shift;
	my $v = shift;
	if ($v =~ /^\s*\{(.*)\}/) {
		my $tq = $1;
		my @tvs = ();
		while ($tq) {
			if ($tq =~ /(\w+)=\"([^\"]*)\"(.*)/) {
				push(@tvs,[$1,$2]);
				$tq = $3;
			}
			elsif ($tq =~ /(\w+)=(\w+)(.*)/) {
				push(@tvs,[$1,$2]);
				$tq = $3;
			}
			else {
				$self->throw($v);
			}
			if ($tq =~ /^s*\,\s*(.*)/) {
				$tq = $1;
			}
			elsif ($tq =~ /^\s*$/) {
				# ok
			}



( run in 2.363 seconds using v1.01-cache-2.11-cpan-98e64b0badf )