Re: The new GEDCOM parser
[email protected] (Ron Savage) Tue, 06 Nov 2012 12:08:34 +1100
| Newsgroups | perl.gedcom |
|---|---|
| Message-ID | <[email protected]> |
Hi Steve On 06/11/12 11:23, Stephen Woodbridge wrote: > Ron, > > I think this is a graph not a tree or at best an interconnect forest of > trees. Given a focus node like an individual or a family you can view > look at the trees up or down from that node. > > In graph theory you have nodes and edges, and you can use Dijkstra's > shortest path to find the shortest route through the graph between the > start and end node. It does this by converting the graph into a tree, > but doing so does not maintain all the node because many of them are > parallel paths. You can do the same thing with a gedcom file where nodes > are individuals and families and the relationships are the edges. > > Nodes and edges for sure. Tree versus graph, probably better to think of > it as a graph. Somethings you need to be able to model are: > > IVF as you mentioned. > divorce/re-marriage/adoption/... again as you mentioned. > marriage and offspring of relations. > > If it is a graph, you can use graph theory to process it and these are > well defined algorithms for traversal and manipulation of graphs. Agreed. In the module I was planning to use, Tree::DAG_Node, DAG is in fact Directed Acyclic Graph :-). Of course it may turn out to not be the best choice in these circumstances. I'm also trying somewhat to avoid graph theory terminology at this stage, since it's all hand-waving so far. Further reading for interested parties: https://en.wikipedia.org/wiki/Graph_theory > -Steve > > On 11/5/2012 4:36 PM, Ron Savage wrote: >> Hi Steve >> >> On 06/11/12 00:54, Stephen Woodbridge wrote: >>> Hi Ron, >>> >>> This all sounds great. I have a question on your choice of using a tree >>> structure, can you explain that more? Are you thinking of the file being >>> the root, then having leaves like: indi, fams, famc, etc and then each >>> of these have their respective data hanging off those objects? Or are >>> you thinking the tree would represent the family relationships? I don't >>> see how the later will work. >> >> I got the idea from the nested structure in the GEDCOM doc itself. Any >> nesting in the doc could be represented by children of a node in a tree. >> >> But frankly, I have not thought it through. I really mentioned it to >> help clarify my thoughts, and I strongly suspect actual coding will >> modify my plan. >> >> But in a bit more detail: An individual can be seen as a node in a tree, >> in which case: >> >> o They have a list of (2) grandparents (IVF aside!) >> >> o They have a list of (N) spouses >> >> o They have a list of (N) children >> >> o (As a child) They have a list of (N) care-givers >> >> o (As a patient) They have a list of (N) donors or organs or whatever >> >> And fundamentally, in a tree, every node has N links (normally 1 up, N >> sideways and N down), and those links have metadata which would be used >> to represent the type of link. >> >> The most obvious problem with a tree is the cross-links due to >> divorce/re-marriage/adoption/... >> >> Still, whatever the data structure chosen, /something/ has to be chosen >> just to hold the data in memory. >> >>> -Steve >>> >>> On 11/5/2012 2:04 AM, Ron Savage wrote: >>>> Hi >>>> >>>> The new GEDCOM parser >>>> This document is a collection of ideas which have been percolating >>>> in my mind for a long time. >>>> >>>> Comments welcome. >>>> >>>> Ideas >>>> Module name >>>> Genealogy::Gedcom::Parser. >>>> >>>> A place-holder, Genealogy::Gedcom >>>> <http://metacpan.org/release/Genealogy-Gedcom>, is already on CPAN. >>>> >>>> Note: This module was written before the new, major tools now >>>> available were released. See Tools below. >>>> >>>> ETA >>>> There is no ETA for the parser. >>>> >>>> However, certain Perl-based tools are now available which will make >>>> coding a simple task. See Tools below. >>>> >>>> See also 'Famous Last Words' :-). >>>> >>>> UTF-8 >>>> The code will accept input files in utf-8, and generate files >>>> containing utf-8 characters. >>>> >>>> Apache and mod_perl >>>> These will not be required. I only mention these because references >>>> to them appear in the Gedcom.pm distro. >>>> >>>> Logging >>>> The code will have a built-in logger, so debugging, e.g., can be >>>> turned on with a parameter to new(). >>>> >>>> This logger will use Log::Handler. See Tools below. >>>> >>>> Sub-classing >>>> Sub-classing the main module will be trivial, and samples will be >>>> provided. >>>> >>>> Sub-classing will be done with Hash::FieldHash. See Tools and the >>>> FAQ below. >>>> >>>> Grammars and grammar generators >>>> Like Gedcom.pm, the code will read a GEDCOM grammar in BNF from a >>>> file. >>>> I'll run this phase before shipping the module, so you don't have to. >>>> See Tools below, specifically Marpa::Rules::Simple. >>>> >>>> Bascially, this means the startling complexity of the code in >>>> Gedcom.pm is a thing of the past. >>>> >>>> Operating the parser >>>> Using Marpa, callbacks are triggered when input is recognized. >>>> >>>> So, when lines like these are encountered: >>>> >>>> 1 @<XREF:FAM>@ FAM >>>> 2 RIN <AUTOMATED_RECORD_ID> >>>> >>>> Marpa will automatically call the callback attached to each tag. >>>> >>>> Callbacks will probably have names like 'do_fam' and 'do_rin', i.e. >>>> of the format 'do_$tag'. >>>> >>>> The parameters passed to the callback include the non-tag text on >>>> the line. >>>> >>>> Default callbacks for all tags will be provided, each one doing its >>>> part in parsing the parameters to the tag, and storing the result. >>>> >>>> The result will probably be stored in a tree. See Tools below, >>>> specifically Tree::DAG_Node. >>>> >>>> Database support >>>> A DBD::SQLite database is possible. >>>> >>>> Tools >>>> o Hash::FieldHash >>>> Simplifies class-building. >>>> >>>> As for the obvious question, why not use Moose, see the FAQ below. >>>> >>>> o Log::Handling >>>> Simplifies logging. >>>> >>>> o Marpa::R2 >>>> This is the modern way to do parsing. >>>> >>>> Home page <http://jeffreykegler.github.com/Marpa-web-site/>. >>>> >>>> Jeffrey's blog about Marpa >>>> <http://jeffreykegler.github.com/Ocean-of-Awareness-blog/>. >>>> >>>> My recent article about lexing and parsing with Marpa >>>> >>>> <http://www.perl.com/pub/2012/10/an-overview-of-lexing-and-parsing.html>. >>>> >>>> >>>> >>>> o MarpaX::Simple::Rules >>>> This module reads a grammar in BNF and generates a Marpa grammar. >>>> >>>> Hence it will read a BNF version of the GEDCOM spec and output >>>> the matching Marpa grammar. >>>> >>>> o Tree::DAG_Node >>>> The most sophisticated tree-handling code on CPAN. I've recently >>>> become co-maintainer of this module. >>>> >>>> FAQ >>>> Why did you choose Hash::FieldHash over Moose? >>>> My policy is to use the light-weight Hash::FieldHash for stand-alone >>>> modules and Moose for applications. >>>> >>>> Why did you choose to store the data in a tree? >>>> A GEDCOM file's structure can be viewed as a tree, so my initial >>>> plan is to store the data likewise. >>>> >>>> >>> >>> >>> >> >> > > > -- Ron Savage http://savage.net.au/ Ph: 0421 920 622