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 )