Raad has asked for the wisdom of the Perl Monks concerning the following question:
Hi Monks,
I've been struggling with this problem for over a week now and I am about to admit failure at getting a working algorithm! I have a thesaurus of terms consisting of hierarchical tree structures which we use to index our library collection. My objective is to create a database like SQLite to store all existing entries (over 3,000). The thesaurus consists of a subject term and a unique identifier, a description and some other information. Example:
ID 211
TERM BODY REGIONS
TREE A01
DESCRIPTION Anatomical areas of the body.
ID 2
TERM ABDOMEN
TREE A01.047
DESCRIPTION Portion of the body that lies between the
thorax and the pelvis.
Since I experienced some problems creating foreign keys in SQLite, I decided to store my data in a Hash of Array like:
use strict;
Could anybody direct me in the right direction? Or could you recommend an alternative algorithm using regex for instance? Any help would be appreciated.
I've looked at the ISO Thesaurus modules on CPAN but our data does not conform to this standard. I've also looked at some XML approaches but it was mind boggling, to say the least.
Thanks everybody...
Raad
ID 211
TERM BODY REGIONS
TREE A01
DESCRIPTION Anatomical areas of the body.
ID 2
TERM ABDOMEN
TREE A01.047
DESCRIPTION Portion of the body that lies between the
thorax and the pelvis.
Since I experienced some problems creating foreign keys in SQLite, I decided to store my data in a Hash of Array like:
The algorith for nested sets calls for a recursive technique to populate children nodes.%HoA =( ##id =>["term","parent_id","left_id", "right_id"] 1 => ["Body Regions","","",""], 2 => ["Extremities","1","",""], 3 => ["Arm","2","",""], 4 => ["Elbow","2","",""], 5 => ["Hand","2","",""], 6 => ["Fingers","5","",""], 7 => ["Thumbs","6","",""] );
use strict;
my %HoA; my $k; my $root = 1; my $ctr =1; for $k (sort keys %HoA){ walktree($root) unless $k eq""; } sub walktree{ my $id = shift; $HoA{$k}[2]=$ctr++ if $id = $k; ##The walktree recursive sub below enters an eternal loop ##and doesn't execute properly. When I tried to push the ##children elements to a temporary array, it worked just ##fine. Would it be the $id??? walktree($id) if $id =$HoA{$k}[1] ; $HoA{$k}[3]=$ctr++; local $" = "|"; print "$k = @{$HoA{$k}}\n"; }
Could anybody direct me in the right direction? Or could you recommend an alternative algorithm using regex for instance? Any help would be appreciated.
I've looked at the ISO Thesaurus modules on CPAN but our data does not conform to this standard. I've also looked at some XML approaches but it was mind boggling, to say the least.
Thanks everybody...
Raad
Edited by Chady -- removed <br> tags from code.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Tree Traversal Script/Nested Sets
by jZed (Prior) on Jul 13, 2004 at 20:26 UTC | |
Re: Tree Traversal Script/Nested Sets
by Hero Zzyzzx (Curate) on Jul 14, 2004 at 14:18 UTC | |
Re: Tree Traversal Script/Nested Sets
by bsb (Priest) on Jul 14, 2004 at 02:56 UTC | |
Re: Tree Traversal Script/Nested Sets
by dragonchild (Archbishop) on Jul 14, 2004 at 12:40 UTC |
Back to
Seekers of Perl Wisdom