Noonoo, I probably won't be of much help, but who knows...
You're lucky with only a limited number of levels

because then I might provide you a first step...
(As I've not enough time to read it all over again & work it out in detail, I hope I didn't make any logical errors...)
(And, in the end, I hope I didn't reinvent the wheel, having some much better white paper about hierarchical data issues elsewhere °-[)
First, as you talk about hiërarchical data, I suppose you're not talking about one-to-many relationships but about typical parent-to-child relationships (like: gender tree, construction units,...). Here I wonder why you don't use two tables instead of one? I would rather use:
E.g. tblPersons = ps_ID (long) + ps_IDParent (long) + ps_Name (string)
where ps_IDParent is related to ps_ID using a 'self/recursive join'.
Remarks:
- to avoid null values in the ps_IDparent field (and apply referential integrity,...), include an 'origin' record(/entry) (like ps_ID = ps_IDparent = 0, ps_name = "-") which can be used as the parentID for all highest-level records(/entries) (say the stems of the trees in the hiërarchy);
- if you can't just merge the two tables into this structure because both 'entities' have a number of different properties, you can reorganise them into one 'super'table with ID, parentID & common properties on which you can perform the self join and which is used furtheron and 1-1-related 'sub'tables in which you store the 'specific' properties (which you can merge with the supertable again later using queries). (**)
- this structure allows 'downward' branching only. To allow 'upward' branching too (like entering both mother and father), which seems to be the case in your situation, you need to split the table into tblPersons = ps_ID + ps_Name and tblRelations = re_ID + re_parentID (+ optional type,...)+ re_IDperson (foreign key). I assume this will complicate the next steps furtheron: you might be bound to use ID's instead of the calculated fields in the query in the second step; also if you want to use tblPersons-fields in your queries & reports, include all up-and-down-relatives (like nephews,...) "from mother's side", and so on... (***)
- other form,... design issues I leave out of scope here.
Second, a query can list for each record(/entry) all 'parents' and 'children' on all 6 higher and lower levels.
E.g. qryTree (1 level up & down) = SELECT tblPersons.ps_ID, IIf(Not IsNull([tblpersons_1Up]![ps_ID]),"(" & [tblpersons_1Up]![ps_ID] & ") " & [tblpersons_1Up]![ps_Name]) AS OneUp, tblPersons.ps_Name, IIf(Not IsNull([tblpersons_1Down]![ps_ID]),"(" & [tblpersons_1Down]![ps_ID] & ") " & [tblpersons_1Down]![ps_Name]) AS OneDown
FROM tblPersons AS tblPersons_1Down RIGHT JOIN (tblPersons LEFT JOIN tblPersons AS tblPersons_1Up ON tblPersons.ps_IDparent = tblPersons_1Up.ps_ID) ON tblPersons_1Down.ps_IDparent = tblPersons.ps_ID
WHERE (((tblPersons.ps_ID)<>0))
ORDER BY tblPersons.ps_ID, IIf(Not IsNull([tblpersons_1Up]![ps_ID]),"(" & [tblpersons_1Up]![ps_ID] & ") " & [tblpersons_1Up]![ps_Name]), IIf(Not IsNull([tblpersons_1Down]![ps_ID]),"(" & [tblpersons_1Down]![ps_ID] & ") " & [tblpersons_1Down]![ps_Name]);
(*) SQL of query with four levels at the end of this post
This query
- shows as columns: ID current record, higher level record ID & name's , current record name, lower levels record Id & name's
- uses calculated fields instead of ID's describing the related entries in the higher & lower levels
- uses outer joins to offer a complete listing of all 'relations'
- results in at least one record for each current record and one extra record for each extra branch present in the 'lower' levels;
- uses a criterium to exclude the 'origin' entry from the list
- sorts on (1) ID current record (2) ID's of related records, from the highest to the lowest level
So... maybe it might be a starting point for your purpose.
I'm sorry I've no time to dig deeper, but you might need some more
- queries, e.g. to include any 'up-and-down'-relatives too (like the current record's brothers, sisters, nephews & cousins, uncles & ounts,...). To go up and down the chain requires another query combining, I guess, the previous one and the original table;
- reports, in which you can group, let a value show up in a group only once for the first record,... and
- functions, like, to concatenate names from the children records,...
Is this of any help?
(*) SELECT tblPersons.ps_ID, IIf(Not IsNull([tblpersons_4Up]![ps_ID]),"(" & [tblpersons_4Up]![ps_ID] & ") " & [tblpersons_4Up]![ps_Name]) AS FourUp, IIf(Not IsNull([tblpersons_3Up]![ps_ID]),"(" & [tblpersons_3Up]![ps_ID] & ") " & [tblpersons_3Up]![ps_Name]) AS ThreeUp, IIf(Not IsNull([tblpersons_2Up]![ps_ID]),"(" & [tblpersons_2Up]![ps_ID] & ") " & [tblpersons_2Up]![ps_Name]) AS TwoUp, IIf(Not IsNull([tblpersons_1Up]![ps_ID]),"(" & [tblpersons_1Up]![ps_ID] & ") " & [tblpersons_1Up]![ps_Name]) AS OneUp, tblPersons.ps_Name, IIf(Not IsNull([tblpersons_1Down]![ps_ID]),"(" & [tblpersons_1Down]![ps_ID] & ") " & [tblpersons_1Down]![ps_Name]) AS OneDown, IIf(Not IsNull([tblpersons_2Down]![ps_ID]),"(" & [tblpersons_2Down]![ps_ID] & ") " & [tblpersons_2Down]![ps_Name]) AS TwoDown, IIf(Not IsNull([tblpersons_3Down]![ps_ID]),"(" & [tblpersons_3Down]![ps_ID] & ") " & [tblpersons_3Down]![ps_Name]) AS ThreeDown, IIf(Not IsNull([tblpersons_4Down]![ps_ID]),"(" & [tblpersons_4Down]![ps_ID] & ") " & [tblpersons_4Down]![ps_Name]) AS FourDown
FROM ((((((tblPersons AS tblPersons_1Down RIGHT JOIN (tblPersons LEFT JOIN tblPersons AS tblPersons_1Up ON tblPersons.ps_IDparent = tblPersons_1Up.ps_ID) ON tblPersons_1Down.ps_IDparent = tblPersons.ps_ID) LEFT JOIN tblPersons AS tblPersons_2Down ON tblPersons_1Down.ps_ID = tblPersons_2Down.ps_IDparent) LEFT JOIN tblPersons AS tblPersons_2Up ON tblPersons_1Up.ps_IDparent = tblPersons_2Up.ps_ID) LEFT JOIN tblPersons AS tblPersons_3Up ON tblPersons_2Up.ps_IDparent = tblPersons_3Up.ps_ID) LEFT JOIN tblPersons AS tblPersons_4Up ON tblPersons_3Up.ps_IDparent = tblPersons_4Up.ps_ID) LEFT JOIN tblPersons AS tblPersons_3Down ON tblPersons_2Down.ps_ID = tblPersons_3Down.ps_IDparent) LEFT JOIN tblPersons AS tblPersons_4Down ON tblPersons_3Down.ps_ID = tblPersons_4Down.ps_IDparent
WHERE (((tblPersons.ps_ID)<>0))
ORDER BY tblPersons.ps_ID, IIf(Not IsNull([tblpersons_4Up]![ps_ID]),"(" & [tblpersons_4Up]![ps_ID] & ") " & [tblpersons_4Up]![ps_Name]), IIf(Not IsNull([tblpersons_3Up]![ps_ID]),"(" & [tblpersons_3Up]![ps_ID] & ") " & [tblpersons_3Up]![ps_Name]), IIf(Not IsNull([tblpersons_2Up]![ps_ID]),"(" & [tblpersons_2Up]![ps_ID] & ") " & [tblpersons_2Up]![ps_Name]), IIf(Not IsNull([tblpersons_1Up]![ps_ID]),"(" & [tblpersons_1Up]![ps_ID] & ") " & [tblpersons_1Up]![ps_Name]), IIf(Not IsNull([tblpersons_1Down]![ps_ID]),"(" & [tblpersons_1Down]![ps_ID] & ") " & [tblpersons_1Down]![ps_Name]), IIf(Not IsNull([tblpersons_2Down]![ps_ID]),"(" & [tblpersons_2Down]![ps_ID] & ") " & [tblpersons_2Down]![ps_Name]), IIf(Not IsNull([tblpersons_3Down]![ps_ID]),"(" & [tblpersons_3Down]![ps_ID] & ") " & [tblpersons_3Down]![ps_Name]), IIf(Not IsNull([tblpersons_4Down]![ps_ID]),"(" & [tblpersons_4Down]![ps_ID] & ") " & [tblpersons_4Down]![ps_Name]);
(**) Difficult to find an example... fwiw: suppose you have a library database in which you keep information about library chapters, articles, books, series/compendia. Those items may (but not have to) be part of a higher level item (e.g. articles can be available as individual copies or as articles included in books,...) and you want to be free to store information on these items no matter what their actual physical condition is (e.g. information of both articles in a book - which your library doesn't possess 'physically' as individual items - and of individual articles). Then a super table might be tblItems = it_ID + it_ParentID + it_Type (article/book/...) + ... Subtables might be tblArticles = ar_IDitem + ar_Title + ..., tblCompendia = ..., a table with fields which only apply for physically autonomously managed items (price, provider, library ID,...), etc.
(***) To get an idea where this might lead to, I added a primary key 'ID' to tblPersons (loosing the possibility to inforce the self join's ref. integrity between ps_ID & ps_IDparent in the relationship window, but that's no drama). The query described in step two now showed for the current record an extra record for each upwardly oriented branch in the higher levels (like: mother) *but* it duplicates all 'downward' records too. Moreover, this still doesn't include any 'up-and-down'-relatives in the listing...