we cannot save coderefs, so stop trying; self parser fixes for new relationship regime
Tara L Andrews [Sat, 29 Sep 2012 01:48:22 +0000 (03:48 +0200)]
base/lib/Text/Tradition/Collation/RelationshipStore.pm
base/lib/Text/Tradition/Collation/RelationshipType.pm
base/lib/Text/Tradition/Parser/Self.pm
base/t/data/globalrel_test.xml [new file with mode: 0644]

index 2834a13..923214a 100644 (file)
@@ -146,16 +146,15 @@ has '_equivalence_readings' => (
 sub BUILD {
        my $self = shift;
        
-       my $regularize = sub {
-               return $_[0]->can('regularize') ? $_[0]->regularize : $_[0]->text; };
-
        my @DEFAULT_TYPES = (
                { name => 'collated', bindlevel => 50, is_weak => 1, is_transitive => 0, is_generalizable => 0 },
-               { name => 'orthographic', bindlevel => 0 },
-               { name => 'spelling', bindlevel => 1, record_sub => $regularize },
-               { name => 'punctuation', bindlevel => 2, record_sub => $regularize },
-               { name => 'grammatical', bindlevel => 2, record_sub => $regularize },
-               { name => 'lexical', bindlevel => 2, record_sub => $regularize },
+               { name => 'orthographic', bindlevel => 0, use_regular => 0 },
+               { name => 'spelling', bindlevel => 1 },
+               { name => 'punctuation', bindlevel => 2 },
+               { name => 'grammatical', bindlevel => 2 },
+               { name => 'lexical', bindlevel => 2 },
+               { name => 'uncertain', bindlevel => 50, is_transitive => 0, is_generalizable => 0 },
+               { name => 'other', bindlevel => 50, is_transitive => 0, is_generalizable => 0 },
                { name => 'transposition', bindlevel => 50, is_colocation => 0, is_transitive => 0 },
                { name => 'repetition', bindlevel => 50, is_colocation => 0, is_transitive => 0 }
                );
@@ -165,9 +164,6 @@ sub BUILD {
        }
 }
 
-sub _regular_form {
-}
-
 around add_type => sub {
     my $orig = shift;
     my $self = shift;
@@ -258,6 +254,7 @@ sub create {
        
        $rel = Text::Tradition::Collation::Relationship->new( $options );
        my $reltype = $self->type( $rel->type );
+       throw( "Unrecognized relationship type " . $rel->type ) unless $reltype;
        # Validate the options given against the relationship type wanted
        throw( "Cannot set nonlocal scope on relationship of type " . $reltype->name )
                if $rel->nonlocal && !$reltype->is_generalizable;
@@ -445,6 +442,11 @@ try {
        ok( 0, "Failed to add normal transposition complement: " . $e->message );
 }
 
+# TODO Test 4: make a global relationship that involves re-ranking a node first, when 
+# the prior rank has a potential match too
+my $t4 = Text::Tradition->new( 'input' => 'Self', 'file' => 't/data/globalrel_test.xml' );
+
+
 =end testing
 
 =cut
@@ -459,8 +461,9 @@ sub add_relationship {
                if( $sourceobj->is_meta || $targetobj->is_meta );
        my $relationship;
        my $reltype;
-       my $thispaironly;
+       my $thispaironly = delete $options->{thispaironly};
        my $droppedcolls = [];
+       $DB::single = 1 if $source eq 'r796.3' && $target eq 'r796.4';
        if( ref( $options ) eq 'Text::Tradition::Collation::Relationship' ) {
                $relationship = $options;
                $reltype = $self->type( $relationship->type );
@@ -475,8 +478,8 @@ sub add_relationship {
                $reltype = $self->type( $options->{type} );
                
                # Try to create the relationship object.
-               my $rdga = $reltype->record_sub->( $sourceobj );
-               my $rdgb = $reltype->record_sub->( $targetobj );
+               my $rdga = $reltype->regularize( $sourceobj );
+               my $rdgb = $reltype->regularize( $targetobj );
                $options->{'orig_a'} = $sourceobj;
                $options->{'orig_b'} = $targetobj;
                $options->{'reading_a'} = $rdga;
@@ -606,11 +609,11 @@ sub _find_applicable {
        my $reltype = $self->type( $rel->type );
        my @vectors;
        my @identical_readings;
-       @identical_readings = grep { $reltype->record_sub->( $_ ) eq $rel->reading_a } 
+       @identical_readings = grep { $reltype->regularize( $_ ) eq $rel->reading_a } 
                $c->readings;
        foreach my $ir ( @identical_readings ) {
                my @itarget;
-               @itarget = grep { $reltype->record_sub->( $_ ) eq $rel->reading_b } 
+               @itarget = grep { $reltype->regularize( $_ ) eq $rel->reading_b } 
                        $c->readings_at_rank( $ir->rank );
                if( @itarget ) {
                        # Warn if there is more than one hit with no closer link between them.
@@ -680,7 +683,8 @@ sub relationship_valid {
     my $reltype = $self->type( $rel );
     ## Assume validity is okay if we are initializing from scratch.
     return ( 1, "initializing" ) unless $c->tradition->_initialized;
-    ## TODO Move this block to relationship type definition
+    ## TODO Move this block to relationship type definition when we can save
+    ## coderefs
     if ( $rel eq 'transposition' || $rel eq 'repetition' ) {
                # Check that the two readings do (for a repetition) or do not (for
                # a transposition) appear in the same witness.
@@ -1007,7 +1011,7 @@ sub test_equivalence {
                $self->equivalence_graph->delete_edge( $teq, $succ ) if $added_succ{$succ};
        }
        unless( $self->equivalence_graph->eq( $checkstr ) ) {
-               warn "GRAPH CHANGED after testing";
+               throw( "GRAPH CHANGED after testing" );
        }
        # Return our answer
        return $ret;
@@ -1271,6 +1275,14 @@ sub _add_graphml_data {
     $data_el->appendText( $value );
 }
 
+sub dump_segment {
+       my( $self, $from, $to ) = @_;
+       open( DUMP, ">debug.svg" ) or die "Could not open debug.svg";
+       binmode DUMP, ':utf8';
+       print DUMP $self->collation->as_svg({ from => $from, to => $to, nocalc => 1 });
+       close DUMP;
+}
+
 sub throw {
        Text::Tradition::Error->throw( 
                'ident' => 'Relationship error',
index 98b17f6..5320ebe 100644 (file)
@@ -37,15 +37,16 @@ for the internal 'collated' relationship, only to be used by parsers.
 =item * is_colocation - (Default true) Whether this relationship implies
 that the readings in question have parallel locations.
 
-=item * is_transitive - (Default $self->is_colocation) Whether this
-relationship type is transitive - that is, if A is related to B and C this
-way, is B necessarily related to C?
+=item * is_transitive - (Default 1) Whether this relationship type is
+transitive - that is, if A is related to B and C this way, is B necessarily
+related to C?
 
-=item * is_generalizable - Whether this relationship can have a non-local
-scope.
+=item * is_generalizable - (Default is_colocation) Whether this
+relationship can have a non-local scope.
 
-=item * record_sub - A subroutine to canonify the reading text before 
-determining whether individual readings match. Defaults to no canonization.
+=item * use_regular - (Default is_generalizable) Whether, when a
+relationship has a non-local scope, the search should be made on the
+regularized form of the reading.
 
 =back
 
@@ -63,9 +64,9 @@ determining whether individual readings match. Defaults to no canonization.
 
 =head2 is_generalizable
 
-=head2 record_sub
+=head2 use_regular
 
-See the option descriptions above.
+See the option descriptions above. All attributes are read-only.
 
 =cut
 
@@ -106,14 +107,77 @@ has 'is_generalizable' => (
        default => sub { $_[0]->is_colocation }
        );
        
-has 'record_sub' => (
+# TODO I really want to make some configurable coderefs...
+
+has 'use_regular' => (
        is => 'ro',
-       isa => 'CodeRef',
-       default => sub { sub { $_[0]->text } }
+       isa => 'Bool',
+       lazy => 1,
+       default => sub { $_[0]->is_generalizable }
        );
        
-# TODO Define extra validation conditions here
+=head1 DEFAULTS
+
+This package provides the following set of relationships as default:
+
+=head2 orthographic: bindlevel => 0, use_regular => 0
+
+The readings are orthographic variants of each other (e.g. upper vs. lower case letters.) If the Morphology plugin is in use, orthographically related readings should regularize to the same string.
+
+=head2 spelling: bindlevel => 1
+
+The readings are spelling variations of the same word(s), e.g. 'color' vs. 'colour'.
+
+=head2 punctuation: bindlevel => 2
+
+The readings are both punctuation markers.
+
+=head2 grammatical: bindlevel => 2
+
+The readings are morphological variants of the same root word, e.g. 'was' vs. 'were'.
+
+=head2 lexical: bindlevel => 2
+
+The readings have the same morphological function but different root words, e.g. '[they] worked' vs. '[they] played'.
+
+=head2 uncertain: bindlevel => 50, is_transitive => 0, is_generalizable => 0
+
+The readings are (probably) related, but it is impossible to say for sure how. Useful for when one or both of the readings is itself uncertain.
+
+=head2 transposition: bindlevel => 50, is_colocation => 0
+
+The readings are the same (or perhaps close variants), but the position has shifted across witnesses.
+
+=head2 repetition: bindlevel => 50, is_colocation => 0, is_transitive => 0
+
+One of the readings is a repetition of the other, e.g. "pet the cat" vs. "pet the the cat".
+
+=head2 other: bindlevel => 50, is_transitive => 0, is_generalizable => 0
+
+A catch-all relationship for cases not covered by the other relationship types.
+
+=head2 collated: bindlevel => 50, is_weak => 1, is_generalizable => 0
+
+For internal use only. Denotes a parallel pair of variant readings as detected by an automatic collator.
+
+=head1 METHODS
+
+=head2 regularize( $reading )
+
+Given a Reading object, return the regular form of the reading text that this
+relationship type expects.
+
+=cut
        
+# TODO Define extra validation conditions here when we can store coderefs
+
+sub regularize {
+       my( $self, $rdg ) = @_;
+       if( $self->use_regular && $rdg->can('regularize') ) {
+               return $rdg->regularize;
+       }
+       return $rdg->text;
+}
 no Moose;
 __PACKAGE__->meta->make_immutable;
 
index b9af342..2e5425d 100644 (file)
@@ -265,8 +265,19 @@ sub parse {
        # Nodes are added via the call to add_reading above.  We only need
        # add the relationships themselves.
        # TODO check that scoping does trt
+       $tradition->_init_done( 1 ); # so that relationships get validated
        $rel_data->{'edges'} ||= []; # so that the next line doesn't break on no rels
-       foreach my $e ( sort { _layersort_rel( $a, $b ) } @{$rel_data->{'edges'}} ) {
+       # Backward compatibility...
+       if( $use_version eq '2.0' || $use_version eq '3.0' ) {
+               foreach my $e ( @{$rel_data->{'edges'}} ) {
+                       delete $e->{'class'};
+                       $e->{'type'} = delete $e->{'relationship'} if exists $e->{'relationship'};
+               }
+       }
+
+       my $rg = $collation->relations;
+       foreach my $e ( sort { _apply_relationship_order( $a, $b, $rg ) } 
+                                                @{$rel_data->{'edges'}} ) {
        my $sourceid = exists $namechange{$e->{'source'}->{'id'}}
                ? $namechange{$e->{'source'}->{'id'}} : $e->{'source'}->{'id'};
        my $targetid = exists $namechange{$e->{'target'}->{'id'}}
@@ -276,11 +287,6 @@ sub parse {
                delete $e->{'source'};
                delete $e->{'target'};
                # The remaining keys are relationship attributes.
-               # Backward compatibility...
-               if( $use_version eq '2.0' || $use_version eq '3.0' ) {
-                       delete $e->{'class'};
-                       $e->{'type'} = delete $e->{'relationship'} if exists $e->{'relationship'};
-               }
                # Add the specified relationship unless we already have done.
                my $rel_exists;
                if( $e->{'scope'} ne 'local' ) {
@@ -288,12 +294,16 @@ sub parse {
                        if( $relobj && $relobj->scope eq $e->{'scope'}
                                && $relobj->type eq $e->{'type'} ) {
                                $rel_exists = 1;
+                       } else {
+                               # Don't propagate the relationship; all the propagations are
+                               # already in the XML.
+                               $e->{'thispaironly'} = 1;
                        }
                }
                try {
                        $collation->add_relationship( $from, $to, $e ) unless $rel_exists;
-               } catch( Text::Tradition::Error $e ) {
-                       warn "DROPPING $from -> $to: " . $e->message;
+               } catch( Text::Tradition::Error $err ) {
+                       warn "DROPPING " . $e->{type} . " rel on $from -> $to: " . $err->message;
                }
        }
        
@@ -302,19 +312,19 @@ sub parse {
        $collation->text_from_paths();  
 }
 
-## Return the relationship that comes first in priority.
-my %LAYERS = (
-       'collated' => 1,
-       'orthographic' => 2,
-       'spelling' => 3,
-       );
-
-sub _layersort_rel {
-       my( $a, $b ) = @_;
-       my $key = exists $a->{'type'} ? 'type' : 'relationship';
-       my $at = $LAYERS{$a->{$key}} || 99;
-       my $bt = $LAYERS{$b->{$key}} || 99;
-       return $at <=> $bt;
+# Helper sort function for applying the saved relationships in a
+# sensible order.
+sub _apply_relationship_order {
+       my( $a, $b, $rg ) = @_;
+       my $at = $rg->type( $a->{type} ); my $bt = $rg->type( $b->{type} );
+       # Apply strong relationships before weak
+       return -1 if $bt->is_weak && !$at->is_weak;
+       return 1 if $at->is_weak && !$bt->is_weak;
+       # Apply local before global
+       return -1 if $a->{scope} eq 'local' && $b->{scope} ne 'local';
+       return 1 if $b->{scope} eq 'local' && $a->{scope} ne 'local';
+       # Apply more tightly bound relationships first
+       return $at->bindlevel <=> $bt->bindlevel;
 }
 
 1;
@@ -325,10 +335,6 @@ sub _layersort_rel {
 
 =item * Make this into a stream parser with GraphML
 
-=item * Simply field -> attribute correspondence for nodes and edges
-
-=item * Share key name constants with Collation.pm
-
 =back
 
 =head1 LICENSE
diff --git a/base/t/data/globalrel_test.xml b/base/t/data/globalrel_test.xml
new file mode 100644 (file)
index 0000000..255a8e8
--- /dev/null
@@ -0,0 +1,1387 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
+  <key attr.name="language" attr.type="string" for="graph" id="dg0"/>
+  <key attr.name="name" attr.type="string" for="graph" id="dg1"/>
+  <key attr.name="public" attr.type="boolean" for="graph" id="dg2"/>
+  <key attr.name="stemmata" attr.type="string" for="graph" id="dg3"/>
+  <key attr.name="user" attr.type="string" for="graph" id="dg4"/>
+  <key attr.name="version" attr.type="string" for="graph" id="dg5"/>
+  <key attr.name="grammar_invalid" attr.type="boolean" for="node" id="dn0"/>
+  <key attr.name="id" attr.type="string" for="node" id="dn1"/>
+  <key attr.name="is_common" attr.type="boolean" for="node" id="dn2"/>
+  <key attr.name="is_end" attr.type="boolean" for="node" id="dn3"/>
+  <key attr.name="is_lacuna" attr.type="boolean" for="node" id="dn4"/>
+  <key attr.name="is_nonsense" attr.type="boolean" for="node" id="dn5"/>
+  <key attr.name="is_ph" attr.type="boolean" for="node" id="dn6"/>
+  <key attr.name="is_start" attr.type="boolean" for="node" id="dn7"/>
+  <key attr.name="join_next" attr.type="boolean" for="node" id="dn8"/>
+  <key attr.name="join_prior" attr.type="boolean" for="node" id="dn9"/>
+  <key attr.name="language" attr.type="string" for="node" id="dn10"/>
+  <key attr.name="lexemes" attr.type="string" for="node" id="dn11"/>
+  <key attr.name="normal_form" attr.type="string" for="node" id="dn12"/>
+  <key attr.name="rank" attr.type="int" for="node" id="dn13"/>
+  <key attr.name="text" attr.type="string" for="node" id="dn14"/>
+  <key attr.name="alters_meaning" attr.type="int" for="edge" id="de0"/>
+  <key attr.name="annotation" attr.type="string" for="edge" id="de1"/>
+  <key attr.name="displayform" attr.type="string" for="edge" id="de2"/>
+  <key attr.name="extra" attr.type="boolean" for="edge" id="de3"/>
+  <key attr.name="non_correctable" attr.type="boolean" for="edge" id="de4"/>
+  <key attr.name="non_independent" attr.type="boolean" for="edge" id="de5"/>
+  <key attr.name="reading_a" attr.type="string" for="edge" id="de6"/>
+  <key attr.name="reading_b" attr.type="string" for="edge" id="de7"/>
+  <key attr.name="scope" attr.type="string" for="edge" id="de8"/>
+  <key attr.name="type" attr.type="string" for="edge" id="de9"/>
+  <key attr.name="witness" attr.type="string" for="edge" id="de10"/>
+  <graph edgedefault="directed" id="Heinrichi_artificial" parse.edgeids="canonical" parse.edges="298" parse.nodeids="canonical" parse.nodes="46" parse.order="nodesfirst">
+    <data key="dg3">digraph stemma {  12 [ class=hypothetical ];  15 [ class=hypothetical ];  17 [ class=hypothetical ];  19 [ class=hypothetical ];  2 [ class=hypothetical ];  20 [ class=hypothetical ];  22 [ class=hypothetical ];  23 [ class=hypothetical ];  24 [ class=hypothetical ];  27 [ class=hypothetical ];  3 [ class=hypothetical ];  30 [ class=hypothetical ];  4 [ class=hypothetical ];  6 [ class=hypothetical ];  A [ class=extant ];  Ab [ class=extant ];  Ac [ class=extant ];  Ad [ class=extant ];  Ae [ class=extant ];  B [ class=extant ];  Ba [ class=extant ];  Bb [ class=extant ];  Bd [ class=extant ];  Be [ class=extant ];  C [ class=extant ];  Ca [ class=extant ];  Cb [ class=extant ];  Cc [ class=extant ];  Cd [ class=extant ];  Ce [ class=extant ];  Cf [ class=extant ];  E [ class=extant ];  F [ class=extant ];  G [ class=extant ];  H [ class=extant ];  K [ class=extant ];  L [ class=extant ];  M [ class=extant ];  N [ class=extant ];  O [ class=extant ];  P [ class=extant ];  R [ class=extant ];  S [ class=extant ];  T [ class=extant ];  V [ class=extant ];  W [ class=extant ];  X [ class=extant ];  Z [ class=extant ];  12 -&gt; Be;  12 -&gt; Ca;  12 -&gt; F;  15 -&gt; 17;  15 -&gt; 20;  15 -&gt; N;  17 -&gt; C;  17 -&gt; Cd;  17 -&gt; E;  19 -&gt; 22;  19 -&gt; Ad;  19 -&gt; Cb;  19 -&gt; Z;  20 -&gt; H;  20 -&gt; X;  2 -&gt; 12;  2 -&gt; 15;  2 -&gt; 19;  22 -&gt; 23;  22 -&gt; 30;  22 -&gt; Ac;  23 -&gt; Cc;  23 -&gt; G;  24 -&gt; A;  24 -&gt; K;  24 -&gt; L;  2 -&gt; 6;  27 -&gt; A;  27 -&gt; M;  30 -&gt; Ab;  30 -&gt; Ce;  30 -&gt; R;  3 -&gt; 4;  3 -&gt; W;  4 -&gt; Ae;  4 -&gt; S;  4 -&gt; T;  6 -&gt; 3;  6 -&gt; Ba;  6 -&gt; Be;  6 -&gt; Ca;  6 -&gt; O;  6 -&gt; P;  6 -&gt; T;  6 -&gt; V;  Ac -&gt; 24;  Ac -&gt; 27;  Ac -&gt; B;  Ac -&gt; Cf;  Be -&gt; Bb;  Be -&gt; Bd;}</data>
+    <data key="dg0">Default</data>
+    <data key="dg5">3.2</data>
+    <data key="dg1">Heinrichi artificial</data>
+    <data key="dg2">1</data>
+    <node id="n0">
+      <data key="dn14">#END#</data>
+      <data key="dn3">1</data>
+      <data key="dn1">__END__</data>
+      <data key="dn13">11</data>
+    </node>
+    <node id="n1">
+      <data key="dn14">#START#</data>
+      <data key="dn7">1</data>
+      <data key="dn1">__START__</data>
+      <data key="dn13">0</data>
+    </node>
+    <node id="n2">
+      <data key="dn10">Default</data>
+      <data key="dn14">Sanoi</data>
+      <data key="dn1">r455.2</data>
+      <data key="dn13">1</data>
+    </node>
+    <node id="n3">
+      <data key="dn10">Default</data>
+      <data key="dn14">sanoi</data>
+      <data key="dn1">r455.3</data>
+      <data key="dn13">1</data>
+    </node>
+    <node id="n4">
+      <data key="dn10">Default</data>
+      <data key="dn14">herra</data>
+      <data key="dn1">r456.2</data>
+      <data key="dn13">2</data>
+    </node>
+    <node id="n5">
+      <data key="dn10">Default</data>
+      <data key="dn14">pyhä</data>
+      <data key="dn1">r456.3</data>
+      <data key="dn13">2</data>
+    </node>
+    <node id="n6">
+      <data key="dn10">Default</data>
+      <data key="dn14">Henärickus</data>
+      <data key="dn1">r457.10</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n7">
+      <data key="dn10">Default</data>
+      <data key="dn14">Henärickns</data>
+      <data key="dn1">r457.11</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n8">
+      <data key="dn10">Default</data>
+      <data key="dn14">heinäricki</data>
+      <data key="dn1">r457.12</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n9">
+      <data key="dn10">Default</data>
+      <data key="dn14">heinärickus</data>
+      <data key="dn1">r457.13</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n10">
+      <data key="dn10">Default</data>
+      <data key="dn14">Heinrickus</data>
+      <data key="dn1">r457.2</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n11">
+      <data key="dn10">Default</data>
+      <data key="dn14">Heinäricki</data>
+      <data key="dn1">r457.3</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n12">
+      <data key="dn10">Default</data>
+      <data key="dn14">Heinrich</data>
+      <data key="dn1">r457.4</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n13">
+      <data key="dn10">Default</data>
+      <data key="dn14">Heinärikens</data>
+      <data key="dn1">r457.5</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n14">
+      <data key="dn10">Default</data>
+      <data key="dn14">Heinrichi</data>
+      <data key="dn1">r457.6</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n15">
+      <data key="dn10">Default</data>
+      <data key="dn14">Heinäricille</data>
+      <data key="dn1">r457.7</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n16">
+      <data key="dn10">Default</data>
+      <data key="dn14">Henäricki</data>
+      <data key="dn1">r457.8</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n17">
+      <data key="dn10">Default</data>
+      <data key="dn14">Heinärickus</data>
+      <data key="dn1">r457.9</data>
+      <data key="dn13">3</data>
+    </node>
+    <node id="n18">
+      <data key="dn10">Default</data>
+      <data key="dn14">Ericuksen</data>
+      <data key="dn1">r458.10</data>
+      <data key="dn13">4</data>
+    </node>
+    <node id="n19">
+      <data key="dn10">Default</data>
+      <data key="dn14">ericuksell</data>
+      <data key="dn1">r458.2</data>
+      <data key="dn13">4</data>
+    </node>
+    <node id="n20">
+      <data key="dn10">Default</data>
+      <data key="dn14">Eijrikillen</data>
+      <data key="dn1">r458.3</data>
+      <data key="dn13">4</data>
+    </node>
+    <node id="n21">
+      <data key="dn10">Default</data>
+      <data key="dn14">erickillen</data>
+      <data key="dn1">r458.4</data>
+      <data key="dn13">4</data>
+    </node>
+    <node id="n22">
+      <data key="dn10">Default</data>
+      <data key="dn14">Erjkellen</data>
+      <data key="dn1">r458.5</data>
+      <data key="dn13">4</data>
+    </node>
+    <node id="n23">
+      <data key="dn10">Default</data>
+      <data key="dn14">erickjllen</data>
+      <data key="dn1">r458.6</data>
+      <data key="dn13">4</data>
+    </node>
+    <node id="n24">
+      <data key="dn10">Default</data>
+      <data key="dn14">Erjkillen</data>
+      <data key="dn1">r458.7</data>
+      <data key="dn13">4</data>
+    </node>
+    <node id="n25">
+      <data key="dn10">Default</data>
+      <data key="dn14">ericillen</data>
+      <data key="dn1">r458.8</data>
+      <data key="dn13">4</data>
+    </node>
+    <node id="n26">
+      <data key="dn10">Default</data>
+      <data key="dn14">Erijkillen</data>
+      <data key="dn1">r458.9</data>
+      <data key="dn13">4</data>
+    </node>
+    <node id="n27">
+      <data key="dn10">Default</data>
+      <data key="dn14">welje</data>
+      <data key="dn1">r459.2</data>
+      <data key="dn13">5</data>
+    </node>
+    <node id="n28">
+      <data key="dn10">Default</data>
+      <data key="dn14">veljelleen</data>
+      <data key="dn1">r460.2</data>
+      <data key="dn13">6</data>
+    </node>
+    <node id="n29">
+      <data key="dn10">Default</data>
+      <data key="dn14">weljellensä</data>
+      <data key="dn1">r460.4</data>
+      <data key="dn13">6</data>
+    </node>
+    <node id="n30">
+      <data key="dn10">Default</data>
+      <data key="dn14">weliellensä</data>
+      <data key="dn1">r460.5</data>
+      <data key="dn13">6</data>
+    </node>
+    <node id="n31">
+      <data key="dn10">Default</data>
+      <data key="dn14">läckömme</data>
+      <data key="dn1">r461.1</data>
+      <data key="dn13">7</data>
+    </node>
+    <node id="n32">
+      <data key="dn10">Default</data>
+      <data key="dn14">Lähkämme</data>
+      <data key="dn1">r461.3</data>
+      <data key="dn13">7</data>
+    </node>
+    <node id="n33">
+      <data key="dn10">Default</data>
+      <data key="dn14">läckäm</data>
+      <data key="dn1">r461.4</data>
+      <data key="dn13">7</data>
+    </node>
+    <node id="n34">
+      <data key="dn10">Default</data>
+      <data key="dn14">läckämme</data>
+      <data key="dn1">r461.5</data>
+      <data key="dn13">7</data>
+    </node>
+    <node id="n35">
+      <data key="dn10">Default</data>
+      <data key="dn14">Läckämme</data>
+      <data key="dn1">r461.6</data>
+      <data key="dn13">7</data>
+    </node>
+    <node id="n36">
+      <data key="dn10">Default</data>
+      <data key="dn14">lähtekämme</data>
+      <data key="dn1">r461.7</data>
+      <data key="dn13">7</data>
+    </node>
+    <node id="n37">
+      <data key="dn10">Default</data>
+      <data key="dn14">Lächkämme</data>
+      <data key="dn1">r461.8</data>
+      <data key="dn13">7</data>
+    </node>
+    <node id="n38">
+      <data key="dn10">Default</data>
+      <data key="dn14">Hämehen</data>
+      <data key="dn1">r462.2</data>
+      <data key="dn13">8</data>
+    </node>
+    <node id="n39">
+      <data key="dn10">Default</data>
+      <data key="dn14">me</data>
+      <data key="dn1">r462.3</data>
+      <data key="dn13">8</data>
+    </node>
+    <node id="n40">
+      <data key="dn10">Default</data>
+      <data key="dn14">hämehen</data>
+      <data key="dn1">r463.2</data>
+      <data key="dn13">8</data>
+    </node>
+    <node id="n41">
+      <data key="dn10">Default</data>
+      <data key="dn14">maallen</data>
+      <data key="dn1">r463.3</data>
+      <data key="dn13">9</data>
+    </node>
+    <node id="n42">
+      <data key="dn10">Default</data>
+      <data key="dn14">Hämehen</data>
+      <data key="dn1">r463.4</data>
+      <data key="dn13">9</data>
+    </node>
+    <node id="n43">
+      <data key="dn10">Default</data>
+      <data key="dn14">tavastjan</data>
+      <data key="dn1">r463.5</data>
+      <data key="dn13">9</data>
+    </node>
+    <node id="n44">
+      <data key="dn10">Default</data>
+      <data key="dn14">Tavastian</data>
+      <data key="dn1">r463.6</data>
+      <data key="dn13">9</data>
+    </node>
+    <node id="n45">
+      <data key="dn10">Default</data>
+      <data key="dn14">maallen</data>
+      <data key="dn1">r464.2</data>
+      <data key="dn13">10</data>
+    </node>
+    <edge source="n1" target="n3" id="e0">
+      <data key="de10">T</data>
+    </edge>
+    <edge source="n1" target="n3" id="e1">
+      <data key="de10">S</data>
+    </edge>
+    <edge source="n1" target="n3" id="e2">
+      <data key="de10">Ac</data>
+    </edge>
+    <edge source="n1" target="n3" id="e3">
+      <data key="de10">Ab</data>
+    </edge>
+    <edge source="n1" target="n3" id="e4">
+      <data key="de10">Ad</data>
+    </edge>
+    <edge source="n1" target="n3" id="e5">
+      <data key="de10">Ae</data>
+    </edge>
+    <edge source="n1" target="n3" id="e6">
+      <data key="de10">B</data>
+    </edge>
+    <edge source="n1" target="n3" id="e7">
+      <data key="de10">Ba</data>
+    </edge>
+    <edge source="n1" target="n3" id="e8">
+      <data key="de10">Bb</data>
+    </edge>
+    <edge source="n1" target="n3" id="e9">
+      <data key="de10">Bd</data>
+    </edge>
+    <edge source="n1" target="n3" id="e10">
+      <data key="de10">Be</data>
+    </edge>
+    <edge source="n1" target="n3" id="e11">
+      <data key="de10">C</data>
+    </edge>
+    <edge source="n1" target="n3" id="e12">
+      <data key="de10">Ca</data>
+    </edge>
+    <edge source="n1" target="n3" id="e13">
+      <data key="de10">Cb</data>
+    </edge>
+    <edge source="n1" target="n3" id="e14">
+      <data key="de10">Cc</data>
+    </edge>
+    <edge source="n1" target="n3" id="e15">
+      <data key="de10">Cd</data>
+    </edge>
+    <edge source="n1" target="n3" id="e16">
+      <data key="de10">Ce</data>
+    </edge>
+    <edge source="n1" target="n3" id="e17">
+      <data key="de10">Cf</data>
+    </edge>
+    <edge source="n1" target="n3" id="e18">
+      <data key="de10">Da</data>
+    </edge>
+    <edge source="n1" target="n3" id="e19">
+      <data key="de10">E</data>
+    </edge>
+    <edge source="n1" target="n3" id="e20">
+      <data key="de10">F</data>
+    </edge>
+    <edge source="n1" target="n3" id="e21">
+      <data key="de10">H</data>
+    </edge>
+    <edge source="n1" target="n3" id="e22">
+      <data key="de10">I</data>
+    </edge>
+    <edge source="n1" target="n3" id="e23">
+      <data key="de10">J</data>
+    </edge>
+    <edge source="n1" target="n3" id="e24">
+      <data key="de10">K</data>
+    </edge>
+    <edge source="n1" target="n3" id="e25">
+      <data key="de10">L</data>
+    </edge>
+    <edge source="n1" target="n3" id="e26">
+      <data key="de10">M</data>
+    </edge>
+    <edge source="n1" target="n3" id="e27">
+      <data key="de10">N</data>
+    </edge>
+    <edge source="n1" target="n3" id="e28">
+      <data key="de10">O</data>
+    </edge>
+    <edge source="n1" target="n3" id="e29">
+      <data key="de10">P</data>
+    </edge>
+    <edge source="n1" target="n3" id="e30">
+      <data key="de10">R</data>
+    </edge>
+    <edge source="n1" target="n2" id="e31">
+      <data key="de10">G</data>
+    </edge>
+    <edge source="n1" target="n3" id="e32">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n2" target="n4" id="e33">
+      <data key="de10">G</data>
+    </edge>
+    <edge source="n3" target="n5" id="e34">
+      <data key="de10">Be</data>
+    </edge>
+    <edge source="n3" target="n5" id="e35">
+      <data key="de10">Cb</data>
+    </edge>
+    <edge source="n3" target="n5" id="e36">
+      <data key="de10">Ce</data>
+    </edge>
+    <edge source="n3" target="n4" id="e37">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n3" target="n4" id="e38">
+      <data key="de10">Ab</data>
+    </edge>
+    <edge source="n3" target="n4" id="e39">
+      <data key="de10">Ac</data>
+    </edge>
+    <edge source="n3" target="n4" id="e40">
+      <data key="de10">Ad</data>
+    </edge>
+    <edge source="n3" target="n4" id="e41">
+      <data key="de10">Ae</data>
+    </edge>
+    <edge source="n3" target="n4" id="e42">
+      <data key="de10">B</data>
+    </edge>
+    <edge source="n3" target="n4" id="e43">
+      <data key="de10">Ba</data>
+    </edge>
+    <edge source="n3" target="n4" id="e44">
+      <data key="de10">Bb</data>
+    </edge>
+    <edge source="n3" target="n4" id="e45">
+      <data key="de10">Bd</data>
+    </edge>
+    <edge source="n3" target="n4" id="e46">
+      <data key="de10">C</data>
+    </edge>
+    <edge source="n3" target="n4" id="e47">
+      <data key="de10">Ca</data>
+    </edge>
+    <edge source="n3" target="n4" id="e48">
+      <data key="de10">Cc</data>
+    </edge>
+    <edge source="n3" target="n4" id="e49">
+      <data key="de10">Cd</data>
+    </edge>
+    <edge source="n3" target="n4" id="e50">
+      <data key="de10">Cf</data>
+    </edge>
+    <edge source="n3" target="n4" id="e51">
+      <data key="de10">Da</data>
+    </edge>
+    <edge source="n3" target="n4" id="e52">
+      <data key="de10">E</data>
+    </edge>
+    <edge source="n3" target="n4" id="e53">
+      <data key="de10">F</data>
+    </edge>
+    <edge source="n3" target="n4" id="e54">
+      <data key="de10">H</data>
+    </edge>
+    <edge source="n3" target="n4" id="e55">
+      <data key="de10">I</data>
+    </edge>
+    <edge source="n3" target="n4" id="e56">
+      <data key="de10">J</data>
+    </edge>
+    <edge source="n3" target="n4" id="e57">
+      <data key="de10">K</data>
+    </edge>
+    <edge source="n3" target="n4" id="e58">
+      <data key="de10">L</data>
+    </edge>
+    <edge source="n3" target="n4" id="e59">
+      <data key="de10">M</data>
+    </edge>
+    <edge source="n3" target="n4" id="e60">
+      <data key="de10">N</data>
+    </edge>
+    <edge source="n3" target="n4" id="e61">
+      <data key="de10">O</data>
+    </edge>
+    <edge source="n3" target="n4" id="e62">
+      <data key="de10">P</data>
+    </edge>
+    <edge source="n3" target="n4" id="e63">
+      <data key="de10">R</data>
+    </edge>
+    <edge source="n3" target="n4" id="e64">
+      <data key="de10">S</data>
+    </edge>
+    <edge source="n3" target="n4" id="e65">
+      <data key="de10">T</data>
+    </edge>
+    <edge source="n4" target="n16" id="e66">
+      <data key="de10">Da</data>
+    </edge>
+    <edge source="n4" target="n7" id="e67">
+      <data key="de10">O</data>
+    </edge>
+    <edge source="n4" target="n17" id="e68">
+      <data key="de10">Ad</data>
+    </edge>
+    <edge source="n4" target="n17" id="e69">
+      <data key="de10">Ae</data>
+    </edge>
+    <edge source="n4" target="n17" id="e70">
+      <data key="de10">Bd</data>
+    </edge>
+    <edge source="n4" target="n17" id="e71">
+      <data key="de10">Cf</data>
+    </edge>
+    <edge source="n4" target="n17" id="e72">
+      <data key="de10">K</data>
+    </edge>
+    <edge source="n4" target="n17" id="e73">
+      <data key="de10">L</data>
+    </edge>
+    <edge source="n4" target="n17" id="e74">
+      <data key="de10">N</data>
+    </edge>
+    <edge source="n4" target="n17" id="e75">
+      <data key="de10">R</data>
+    </edge>
+    <edge source="n4" target="n17" id="e76">
+      <data key="de10">S</data>
+    </edge>
+    <edge source="n4" target="n14" id="e77">
+      <data key="de10">F</data>
+    </edge>
+    <edge source="n4" target="n9" id="e78">
+      <data key="de10">Bb</data>
+    </edge>
+    <edge source="n4" target="n12" id="e79">
+      <data key="de10">G</data>
+    </edge>
+    <edge source="n4" target="n10" id="e80">
+      <data key="de10">M</data>
+    </edge>
+    <edge source="n4" target="n6" id="e81">
+      <data key="de10">Ba</data>
+    </edge>
+    <edge source="n4" target="n6" id="e82">
+      <data key="de10">E</data>
+    </edge>
+    <edge source="n4" target="n6" id="e83">
+      <data key="de10">P</data>
+    </edge>
+    <edge source="n4" target="n6" id="e84">
+      <data key="de10">T</data>
+    </edge>
+    <edge source="n4" target="n13" id="e85">
+      <data key="de10">C</data>
+    </edge>
+    <edge source="n4" target="n11" id="e86">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n4" target="n11" id="e87">
+      <data key="de10">Ab</data>
+    </edge>
+    <edge source="n4" target="n11" id="e88">
+      <data key="de10">Ac</data>
+    </edge>
+    <edge source="n4" target="n11" id="e89">
+      <data key="de10">B</data>
+    </edge>
+    <edge source="n4" target="n11" id="e90">
+      <data key="de10">H</data>
+    </edge>
+    <edge source="n4" target="n11" id="e91">
+      <data key="de10">I</data>
+    </edge>
+    <edge source="n4" target="n11" id="e92">
+      <data key="de10">J</data>
+    </edge>
+    <edge source="n4" target="n15" id="e93">
+      <data key="de10">Cd</data>
+    </edge>
+    <edge source="n4" target="n8" id="e94">
+      <data key="de10">Ca</data>
+    </edge>
+    <edge source="n4" target="n8" id="e95">
+      <data key="de10">Cc</data>
+    </edge>
+    <edge source="n5" target="n17" id="e96">
+      <data key="de10">Be</data>
+    </edge>
+    <edge source="n5" target="n17" id="e97">
+      <data key="de10">Ce</data>
+    </edge>
+    <edge source="n5" target="n9" id="e98">
+      <data key="de10">Cb</data>
+    </edge>
+    <edge source="n6" target="n24" id="e99">
+      <data key="de10">Ba</data>
+    </edge>
+    <edge source="n6" target="n24" id="e100">
+      <data key="de10">P</data>
+    </edge>
+    <edge source="n6" target="n19" id="e101">
+      <data key="de10">E</data>
+    </edge>
+    <edge source="n6" target="n35" id="e102">
+      <data key="de10">T</data>
+    </edge>
+    <edge source="n7" target="n24" id="e103">
+      <data key="de10">O</data>
+    </edge>
+    <edge source="n8" target="n25" id="e104">
+      <data key="de10">Cc</data>
+    </edge>
+    <edge source="n8" target="n21" id="e105">
+      <data key="de10">Ca</data>
+    </edge>
+    <edge source="n9" target="n23" id="e106">
+      <data key="de10">Cb</data>
+    </edge>
+    <edge source="n9" target="n24" id="e107">
+      <data key="de10">Bb</data>
+    </edge>
+    <edge source="n10" target="n24" id="e108">
+      <data key="de10">M</data>
+    </edge>
+    <edge source="n11" target="n24" id="e109">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n11" target="n24" id="e110">
+      <data key="de10">Ab</data>
+    </edge>
+    <edge source="n11" target="n24" id="e111">
+      <data key="de10">Ac</data>
+    </edge>
+    <edge source="n11" target="n24" id="e112">
+      <data key="de10">B</data>
+    </edge>
+    <edge source="n11" target="n24" id="e113">
+      <data key="de10">H</data>
+    </edge>
+    <edge source="n11" target="n24" id="e114">
+      <data key="de10">I</data>
+    </edge>
+    <edge source="n11" target="n24" id="e115">
+      <data key="de10">J</data>
+    </edge>
+    <edge source="n12" target="n24" id="e116">
+      <data key="de10">G</data>
+    </edge>
+    <edge source="n13" target="n24" id="e117">
+      <data key="de10">C</data>
+    </edge>
+    <edge source="n14" target="n18" id="e118">
+      <data key="de10">F</data>
+    </edge>
+    <edge source="n15" target="n26" id="e119">
+      <data key="de10">Cd</data>
+    </edge>
+    <edge source="n16" target="n22" id="e120">
+      <data key="de10">Da</data>
+    </edge>
+    <edge source="n17" target="n26" id="e121">
+      <data key="de10">Be</data>
+    </edge>
+    <edge source="n17" target="n26" id="e122">
+      <data key="de10">N</data>
+    </edge>
+    <edge source="n17" target="n24" id="e123">
+      <data key="de10">Ae</data>
+    </edge>
+    <edge source="n17" target="n24" id="e124">
+      <data key="de10">Bd</data>
+    </edge>
+    <edge source="n17" target="n24" id="e125">
+      <data key="de10">Ce</data>
+    </edge>
+    <edge source="n17" target="n24" id="e126">
+      <data key="de10">Cf</data>
+    </edge>
+    <edge source="n17" target="n24" id="e127">
+      <data key="de10">K</data>
+    </edge>
+    <edge source="n17" target="n24" id="e128">
+      <data key="de10">L</data>
+    </edge>
+    <edge source="n17" target="n24" id="e129">
+      <data key="de10">R</data>
+    </edge>
+    <edge source="n17" target="n24" id="e130">
+      <data key="de10">S</data>
+    </edge>
+    <edge source="n17" target="n20" id="e131">
+      <data key="de10">Ad</data>
+    </edge>
+    <edge source="n18" target="n28" id="e132">
+      <data key="de10">F</data>
+    </edge>
+    <edge source="n19" target="n28" id="e133">
+      <data key="de10">E</data>
+    </edge>
+    <edge source="n20" target="n29" id="e134">
+      <data key="de10">Ad</data>
+    </edge>
+    <edge source="n21" target="n29" id="e135">
+      <data key="de10">Ca</data>
+    </edge>
+    <edge source="n22" target="n29" id="e136">
+      <data key="de10">Da</data>
+    </edge>
+    <edge source="n23" target="n29" id="e137">
+      <data key="de10">Cb</data>
+    </edge>
+    <edge source="n24" target="n27" id="e138">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n24" target="n30" id="e139">
+      <data key="de10">C</data>
+    </edge>
+    <edge source="n24" target="n29" id="e140">
+      <data key="de10">Ab</data>
+    </edge>
+    <edge source="n24" target="n29" id="e141">
+      <data key="de10">Ac</data>
+    </edge>
+    <edge source="n24" target="n29" id="e142">
+      <data key="de10">Ae</data>
+    </edge>
+    <edge source="n24" target="n29" id="e143">
+      <data key="de10">B</data>
+    </edge>
+    <edge source="n24" target="n29" id="e144">
+      <data key="de10">Ba</data>
+    </edge>
+    <edge source="n24" target="n29" id="e145">
+      <data key="de10">Bb</data>
+    </edge>
+    <edge source="n24" target="n29" id="e146">
+      <data key="de10">Bd</data>
+    </edge>
+    <edge source="n24" target="n29" id="e147">
+      <data key="de10">Ce</data>
+    </edge>
+    <edge source="n24" target="n29" id="e148">
+      <data key="de10">Cf</data>
+    </edge>
+    <edge source="n24" target="n29" id="e149">
+      <data key="de10">G</data>
+    </edge>
+    <edge source="n24" target="n29" id="e150">
+      <data key="de10">H</data>
+    </edge>
+    <edge source="n24" target="n29" id="e151">
+      <data key="de10">I</data>
+    </edge>
+    <edge source="n24" target="n29" id="e152">
+      <data key="de10">J</data>
+    </edge>
+    <edge source="n24" target="n29" id="e153">
+      <data key="de10">K</data>
+    </edge>
+    <edge source="n24" target="n29" id="e154">
+      <data key="de10">L</data>
+    </edge>
+    <edge source="n24" target="n29" id="e155">
+      <data key="de10">M</data>
+    </edge>
+    <edge source="n24" target="n29" id="e156">
+      <data key="de10">O</data>
+    </edge>
+    <edge source="n24" target="n29" id="e157">
+      <data key="de10">P</data>
+    </edge>
+    <edge source="n24" target="n29" id="e158">
+      <data key="de10">R</data>
+    </edge>
+    <edge source="n24" target="n29" id="e159">
+      <data key="de10">S</data>
+    </edge>
+    <edge source="n25" target="n29" id="e160">
+      <data key="de10">Cc</data>
+    </edge>
+    <edge source="n26" target="n29" id="e161">
+      <data key="de10">Be</data>
+    </edge>
+    <edge source="n26" target="n29" id="e162">
+      <data key="de10">Cd</data>
+    </edge>
+    <edge source="n26" target="n29" id="e163">
+      <data key="de10">N</data>
+    </edge>
+    <edge source="n27" target="n29" id="e164">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n28" target="n36" id="e165">
+      <data key="de10">F</data>
+    </edge>
+    <edge source="n28" target="n34" id="e166">
+      <data key="de10">E</data>
+    </edge>
+    <edge source="n29" target="n33" id="e167">
+      <data key="de10">Cc</data>
+    </edge>
+    <edge source="n29" target="n37" id="e168">
+      <data key="de10">Bd</data>
+    </edge>
+    <edge source="n29" target="n35" id="e169">
+      <data key="de10">Ab</data>
+    </edge>
+    <edge source="n29" target="n35" id="e170">
+      <data key="de10">Ac</data>
+    </edge>
+    <edge source="n29" target="n35" id="e171">
+      <data key="de10">Ad</data>
+    </edge>
+    <edge source="n29" target="n35" id="e172">
+      <data key="de10">Ba</data>
+    </edge>
+    <edge source="n29" target="n35" id="e173">
+      <data key="de10">Bb</data>
+    </edge>
+    <edge source="n29" target="n35" id="e174">
+      <data key="de10">Be</data>
+    </edge>
+    <edge source="n29" target="n35" id="e175">
+      <data key="de10">H</data>
+    </edge>
+    <edge source="n29" target="n35" id="e176">
+      <data key="de10">J</data>
+    </edge>
+    <edge source="n29" target="n35" id="e177">
+      <data key="de10">K</data>
+    </edge>
+    <edge source="n29" target="n35" id="e178">
+      <data key="de10">L</data>
+    </edge>
+    <edge source="n29" target="n35" id="e179">
+      <data key="de10">M</data>
+    </edge>
+    <edge source="n29" target="n35" id="e180">
+      <data key="de10">N</data>
+    </edge>
+    <edge source="n29" target="n35" id="e181">
+      <data key="de10">P</data>
+    </edge>
+    <edge source="n29" target="n35" id="e182">
+      <data key="de10">R</data>
+    </edge>
+    <edge source="n29" target="n35" id="e183">
+      <data key="de10">S</data>
+    </edge>
+    <edge source="n29" target="n34" id="e184">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n29" target="n34" id="e185">
+      <data key="de10">Ae</data>
+    </edge>
+    <edge source="n29" target="n34" id="e186">
+      <data key="de10">B</data>
+    </edge>
+    <edge source="n29" target="n34" id="e187">
+      <data key="de10">Ca</data>
+    </edge>
+    <edge source="n29" target="n34" id="e188">
+      <data key="de10">Cb</data>
+    </edge>
+    <edge source="n29" target="n34" id="e189">
+      <data key="de10">Cd</data>
+    </edge>
+    <edge source="n29" target="n34" id="e190">
+      <data key="de10">Da</data>
+    </edge>
+    <edge source="n29" target="n34" id="e191">
+      <data key="de10">I</data>
+    </edge>
+    <edge source="n29" target="n34" id="e192">
+      <data key="de10">O</data>
+    </edge>
+    <edge source="n29" target="n36" id="e193">
+      <data key="de10">G</data>
+    </edge>
+    <edge source="n29" target="n32" id="e194">
+      <data key="de10">Cf</data>
+    </edge>
+    <edge source="n29" target="n31" id="e195">
+      <data key="de10">Ce</data>
+    </edge>
+    <edge source="n30" target="n35" id="e196">
+      <data key="de10">C</data>
+    </edge>
+    <edge source="n31" target="n41" id="e197">
+      <data key="de10">Ce</data>
+    </edge>
+    <edge source="n32" target="n42" id="e198">
+      <data key="de10">Cf</data>
+    </edge>
+    <edge source="n33" target="n40" id="e199">
+      <data key="de10">Cc</data>
+    </edge>
+    <edge source="n34" target="n39" id="e200">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n34" target="n42" id="e201">
+      <data key="de10">Ae</data>
+    </edge>
+    <edge source="n34" target="n42" id="e202">
+      <data key="de10">B</data>
+    </edge>
+    <edge source="n34" target="n42" id="e203">
+      <data key="de10">Cd</data>
+    </edge>
+    <edge source="n34" target="n42" id="e204">
+      <data key="de10">Da</data>
+    </edge>
+    <edge source="n34" target="n42" id="e205">
+      <data key="de10">E</data>
+    </edge>
+    <edge source="n34" target="n42" id="e206">
+      <data key="de10">I</data>
+    </edge>
+    <edge source="n34" target="n42" id="e207">
+      <data key="de10">O</data>
+    </edge>
+    <edge source="n34" target="n40" id="e208">
+      <data key="de10">Ca</data>
+    </edge>
+    <edge source="n34" target="n40" id="e209">
+      <data key="de10">Cb</data>
+    </edge>
+    <edge source="n35" target="n38" id="e210">
+      <data key="de10">Ab</data>
+    </edge>
+    <edge source="n35" target="n42" id="e211">
+      <data key="de10">Ac</data>
+    </edge>
+    <edge source="n35" target="n42" id="e212">
+      <data key="de10">Ad</data>
+    </edge>
+    <edge source="n35" target="n42" id="e213">
+      <data key="de10">Ba</data>
+    </edge>
+    <edge source="n35" target="n42" id="e214">
+      <data key="de10">Bb</data>
+    </edge>
+    <edge source="n35" target="n42" id="e215">
+      <data key="de10">Be</data>
+    </edge>
+    <edge source="n35" target="n42" id="e216">
+      <data key="de10">C</data>
+    </edge>
+    <edge source="n35" target="n42" id="e217">
+      <data key="de10">H</data>
+    </edge>
+    <edge source="n35" target="n42" id="e218">
+      <data key="de10">J</data>
+    </edge>
+    <edge source="n35" target="n42" id="e219">
+      <data key="de10">K</data>
+    </edge>
+    <edge source="n35" target="n42" id="e220">
+      <data key="de10">L</data>
+    </edge>
+    <edge source="n35" target="n42" id="e221">
+      <data key="de10">M</data>
+    </edge>
+    <edge source="n35" target="n42" id="e222">
+      <data key="de10">N</data>
+    </edge>
+    <edge source="n35" target="n42" id="e223">
+      <data key="de10">P</data>
+    </edge>
+    <edge source="n35" target="n42" id="e224">
+      <data key="de10">R</data>
+    </edge>
+    <edge source="n35" target="n42" id="e225">
+      <data key="de10">S</data>
+    </edge>
+    <edge source="n35" target="n42" id="e226">
+      <data key="de10">T</data>
+    </edge>
+    <edge source="n36" target="n44" id="e227">
+      <data key="de10">G</data>
+    </edge>
+    <edge source="n36" target="n43" id="e228">
+      <data key="de10">F</data>
+    </edge>
+    <edge source="n37" target="n42" id="e229">
+      <data key="de10">Bd</data>
+    </edge>
+    <edge source="n38" target="n42" id="e230">
+      <data key="de10">Ab</data>
+    </edge>
+    <edge source="n39" target="n42" id="e231">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n40" target="n45" id="e232">
+      <data key="de10">Ca</data>
+    </edge>
+    <edge source="n40" target="n45" id="e233">
+      <data key="de10">Cb</data>
+    </edge>
+    <edge source="n40" target="n45" id="e234">
+      <data key="de10">Cc</data>
+    </edge>
+    <edge source="n41" target="n45" id="e235">
+      <data key="de10">Ce</data>
+    </edge>
+    <edge source="n42" target="n45" id="e236">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n42" target="n45" id="e237">
+      <data key="de10">Ab</data>
+    </edge>
+    <edge source="n42" target="n45" id="e238">
+      <data key="de10">Ac</data>
+    </edge>
+    <edge source="n42" target="n45" id="e239">
+      <data key="de10">Ad</data>
+    </edge>
+    <edge source="n42" target="n45" id="e240">
+      <data key="de10">Ae</data>
+    </edge>
+    <edge source="n42" target="n45" id="e241">
+      <data key="de10">B</data>
+    </edge>
+    <edge source="n42" target="n45" id="e242">
+      <data key="de10">Ba</data>
+    </edge>
+    <edge source="n42" target="n45" id="e243">
+      <data key="de10">Bb</data>
+    </edge>
+    <edge source="n42" target="n45" id="e244">
+      <data key="de10">Bd</data>
+    </edge>
+    <edge source="n42" target="n45" id="e245">
+      <data key="de10">Be</data>
+    </edge>
+    <edge source="n42" target="n45" id="e246">
+      <data key="de10">C</data>
+    </edge>
+    <edge source="n42" target="n45" id="e247">
+      <data key="de10">Cd</data>
+    </edge>
+    <edge source="n42" target="n45" id="e248">
+      <data key="de10">Cf</data>
+    </edge>
+    <edge source="n42" target="n45" id="e249">
+      <data key="de10">Da</data>
+    </edge>
+    <edge source="n42" target="n45" id="e250">
+      <data key="de10">E</data>
+    </edge>
+    <edge source="n42" target="n45" id="e251">
+      <data key="de10">H</data>
+    </edge>
+    <edge source="n42" target="n45" id="e252">
+      <data key="de10">I</data>
+    </edge>
+    <edge source="n42" target="n45" id="e253">
+      <data key="de10">J</data>
+    </edge>
+    <edge source="n42" target="n45" id="e254">
+      <data key="de10">K</data>
+    </edge>
+    <edge source="n42" target="n45" id="e255">
+      <data key="de10">L</data>
+    </edge>
+    <edge source="n42" target="n45" id="e256">
+      <data key="de10">M</data>
+    </edge>
+    <edge source="n42" target="n45" id="e257">
+      <data key="de10">N</data>
+    </edge>
+    <edge source="n42" target="n45" id="e258">
+      <data key="de10">O</data>
+    </edge>
+    <edge source="n42" target="n45" id="e259">
+      <data key="de10">P</data>
+    </edge>
+    <edge source="n42" target="n45" id="e260">
+      <data key="de10">R</data>
+    </edge>
+    <edge source="n42" target="n45" id="e261">
+      <data key="de10">S</data>
+    </edge>
+    <edge source="n42" target="n45" id="e262">
+      <data key="de10">T</data>
+    </edge>
+    <edge source="n43" target="n45" id="e263">
+      <data key="de10">F</data>
+    </edge>
+    <edge source="n44" target="n45" id="e264">
+      <data key="de10">G</data>
+    </edge>
+    <edge source="n45" target="n0" id="e265">
+      <data key="de10">L</data>
+    </edge>
+    <edge source="n45" target="n0" id="e266">
+      <data key="de10">M</data>
+    </edge>
+    <edge source="n45" target="n0" id="e267">
+      <data key="de10">N</data>
+    </edge>
+    <edge source="n45" target="n0" id="e268">
+      <data key="de10">P</data>
+    </edge>
+    <edge source="n45" target="n0" id="e269">
+      <data key="de10">R</data>
+    </edge>
+    <edge source="n45" target="n0" id="e270">
+      <data key="de10">A</data>
+    </edge>
+    <edge source="n45" target="n0" id="e271">
+      <data key="de10">Ab</data>
+    </edge>
+    <edge source="n45" target="n0" id="e272">
+      <data key="de10">Ac</data>
+    </edge>
+    <edge source="n45" target="n0" id="e273">
+      <data key="de10">B</data>
+    </edge>
+    <edge source="n45" target="n0" id="e274">
+      <data key="de10">Bd</data>
+    </edge>
+    <edge source="n45" target="n0" id="e275">
+      <data key="de10">Be</data>
+    </edge>
+    <edge source="n45" target="n0" id="e276">
+      <data key="de10">Ca</data>
+    </edge>
+    <edge source="n45" target="n0" id="e277">
+      <data key="de10">Cc</data>
+    </edge>
+    <edge source="n45" target="n0" id="e278">
+      <data key="de10">Cd</data>
+    </edge>
+    <edge source="n45" target="n0" id="e279">
+      <data key="de10">Ce</data>
+    </edge>
+    <edge source="n45" target="n0" id="e280">
+      <data key="de10">K</data>
+    </edge>
+    <edge source="n45" target="n0" id="e281">
+      <data key="de10">Ae</data>
+    </edge>
+    <edge source="n45" target="n0" id="e282">
+      <data key="de10">Ba</data>
+    </edge>
+    <edge source="n45" target="n0" id="e283">
+      <data key="de10">Bb</data>
+    </edge>
+    <edge source="n45" target="n0" id="e284">
+      <data key="de10">C</data>
+    </edge>
+    <edge source="n45" target="n0" id="e285">
+      <data key="de10">Cb</data>
+    </edge>
+    <edge source="n45" target="n0" id="e286">
+      <data key="de10">Cf</data>
+    </edge>
+    <edge source="n45" target="n0" id="e287">
+      <data key="de10">Da</data>
+    </edge>
+    <edge source="n45" target="n0" id="e288">
+      <data key="de10">E</data>
+    </edge>
+    <edge source="n45" target="n0" id="e289">
+      <data key="de10">F</data>
+    </edge>
+    <edge source="n45" target="n0" id="e290">
+      <data key="de10">G</data>
+    </edge>
+    <edge source="n45" target="n0" id="e291">
+      <data key="de10">H</data>
+    </edge>
+    <edge source="n45" target="n0" id="e292">
+      <data key="de10">I</data>
+    </edge>
+    <edge source="n45" target="n0" id="e293">
+      <data key="de10">J</data>
+    </edge>
+    <edge source="n45" target="n0" id="e294">
+      <data key="de10">S</data>
+    </edge>
+    <edge source="n45" target="n0" id="e295">
+      <data key="de10">Ad</data>
+    </edge>
+    <edge source="n45" target="n0" id="e296">
+      <data key="de10">O</data>
+    </edge>
+    <edge source="n45" target="n0" id="e297">
+      <data key="de10">T</data>
+    </edge>
+  </graph>
+  <graph edgedefault="directed" id="relationships" parse.edgeids="canonical" parse.edges="5" parse.nodeids="canonical" parse.nodes="46" parse.order="nodesfirst">
+    <node id="n0">
+      <data key="dn1">__END__</data>
+    </node>
+    <node id="n1">
+      <data key="dn1">__START__</data>
+    </node>
+    <node id="n10">
+      <data key="dn1">r457.2</data>
+    </node>
+    <node id="n11">
+      <data key="dn1">r457.3</data>
+    </node>
+    <node id="n12">
+      <data key="dn1">r457.4</data>
+    </node>
+    <node id="n13">
+      <data key="dn1">r457.5</data>
+    </node>
+    <node id="n14">
+      <data key="dn1">r457.6</data>
+    </node>
+    <node id="n15">
+      <data key="dn1">r457.7</data>
+    </node>
+    <node id="n16">
+      <data key="dn1">r457.8</data>
+    </node>
+    <node id="n17">
+      <data key="dn1">r457.9</data>
+    </node>
+    <node id="n18">
+      <data key="dn1">r458.10</data>
+    </node>
+    <node id="n19">
+      <data key="dn1">r458.2</data>
+    </node>
+    <node id="n2">
+      <data key="dn1">r455.2</data>
+    </node>
+    <node id="n20">
+      <data key="dn1">r458.3</data>
+    </node>
+    <node id="n21">
+      <data key="dn1">r458.4</data>
+    </node>
+    <node id="n22">
+      <data key="dn1">r458.5</data>
+    </node>
+    <node id="n23">
+      <data key="dn1">r458.6</data>
+    </node>
+    <node id="n24">
+      <data key="dn1">r458.7</data>
+    </node>
+    <node id="n25">
+      <data key="dn1">r458.8</data>
+    </node>
+    <node id="n26">
+      <data key="dn1">r458.9</data>
+    </node>
+    <node id="n27">
+      <data key="dn1">r459.2</data>
+    </node>
+    <node id="n28">
+      <data key="dn1">r460.2</data>
+    </node>
+    <node id="n29">
+      <data key="dn1">r460.4</data>
+    </node>
+    <node id="n3">
+      <data key="dn1">r455.3</data>
+    </node>
+    <node id="n30">
+      <data key="dn1">r460.5</data>
+    </node>
+    <node id="n31">
+      <data key="dn1">r461.1</data>
+    </node>
+    <node id="n32">
+      <data key="dn1">r461.3</data>
+    </node>
+    <node id="n33">
+      <data key="dn1">r461.4</data>
+    </node>
+    <node id="n34">
+      <data key="dn1">r461.5</data>
+    </node>
+    <node id="n35">
+      <data key="dn1">r461.6</data>
+    </node>
+    <node id="n36">
+      <data key="dn1">r461.7</data>
+    </node>
+    <node id="n37">
+      <data key="dn1">r461.8</data>
+    </node>
+    <node id="n38">
+      <data key="dn1">r462.2</data>
+    </node>
+    <node id="n39">
+      <data key="dn1">r462.3</data>
+    </node>
+    <node id="n4">
+      <data key="dn1">r456.2</data>
+    </node>
+    <node id="n40">
+      <data key="dn1">r463.2</data>
+    </node>
+    <node id="n41">
+      <data key="dn1">r463.3</data>
+    </node>
+    <node id="n42">
+      <data key="dn1">r463.4</data>
+    </node>
+    <node id="n43">
+      <data key="dn1">r463.5</data>
+    </node>
+    <node id="n44">
+      <data key="dn1">r463.6</data>
+    </node>
+    <node id="n45">
+      <data key="dn1">r464.2</data>
+    </node>
+    <node id="n5">
+      <data key="dn1">r456.3</data>
+    </node>
+    <node id="n6">
+      <data key="dn1">r457.10</data>
+    </node>
+    <node id="n7">
+      <data key="dn1">r457.11</data>
+    </node>
+    <node id="n8">
+      <data key="dn1">r457.12</data>
+    </node>
+    <node id="n9">
+      <data key="dn1">r457.13</data>
+    </node>
+    <edge source="n28" target="n29" id="e0">
+      <data key="de6">veljelleen</data>
+      <data key="de7">weljellensä</data>
+      <data key="de0">0</data>
+      <data key="de9">collated</data>
+      <data key="de8">local</data>
+    </edge>
+    <edge source="n29" target="n30" id="e1">
+      <data key="de6">weljellensä</data>
+      <data key="de7">weliellensä</data>
+      <data key="de0">0</data>
+      <data key="de9">collated</data>
+      <data key="de8">local</data>
+    </edge>
+    <edge source="n41" target="n42" id="e2">
+      <data key="de6">maallen</data>
+      <data key="de7">Hämehen</data>
+      <data key="de0">0</data>
+      <data key="de9">collated</data>
+      <data key="de8">local</data>
+    </edge>
+    <edge source="n42" target="n43" id="e3">
+      <data key="de6">Hämehen</data>
+      <data key="de7">tavastjan</data>
+      <data key="de0">0</data>
+      <data key="de9">collated</data>
+      <data key="de8">local</data>
+    </edge>
+    <edge source="n42" target="n44" id="e4">
+      <data key="de6">Hämehen</data>
+      <data key="de7">Tavastian</data>
+      <data key="de0">0</data>
+      <data key="de9">collated</data>
+      <data key="de8">local</data>
+    </edge>
+  </graph>
+</graphml>