I managed to get this working the way I want using this code:
```dataviewjs
// ALL PAGE LINKS
// Grab all links from the current page
let takeawayLinks = dv.array(dv.current().file.path).flatMap(p => dv.page(p).file.inlinks);
// Filter out links from the takeaway that are specific to each type of insight
let takeawayLinksLevelL1Insights = Array.from(takeawayLinks.filter(takeawayLinks => takeawayLinks.path.includes("Level 1 Insights")));
let takeawayLinksLevelL2Insights = Array.from(takeawayLinks.filter(takeawayLinks => takeawayLinks.path.includes("Level 2 Insights")));
let takeawayLinksLevelL3Insights = Array.from(takeawayLinks.filter(takeawayLinks => takeawayLinks.path.includes("Level 3 Insights")));
let takeawayLinksLevelL4Insights = Array.from(takeawayLinks.filter(takeawayLinks => takeawayLinks.path.includes("Level 4 Insights")));
// LEVEL 4 INSIGHTS
// Grab all directly-linked and indirectly-linked Level 4 Insights
let level4Insights = takeawayLinksLevelL4Insights;
// Filter out duplicates from level4Insights
level4Insights = dv.array(level4Insights).groupBy(p => dv.page(p).file.link).key.distinct();
// LEVEL 4 INSIGHTS - ALL LINKS
// Grab all links from Level 4 Insights
let level4InsightsLinks = dv.array(level4Insights).flatMap(p => dv.page(p).file.inlinks);
// LEVEL 4 INSIGHTS - LINKS TO OTHER INSIGHTS
// Filter out links from Level 4 Insights that are specific to other types of insights
let level4InsightsLinksLevel3Insights = Array.from(level4InsightsLinks.filter(level4InsightsLinks => level4InsightsLinks.path.includes("Level 3 Insights")));
let level4InsightsLinksLevel2Insights = Array.from(level4InsightsLinks.filter(level4InsightsLinks => level4InsightsLinks.path.includes("Level 2 Insights")));
let level4InsightsLinksLevel1Insights = Array.from(level4InsightsLinks.filter(level4InsightsLinks => level4InsightsLinks.path.includes("Level 1 Insights")));
// LEVEL 4 INSIGHTS - LINKS TO ASSUMPTIONS
// Grab all links to Assumptions from Level 4 Insights
let level4InsightsAssumptions = Array.from(level4InsightsLinks.filter(level4InsightsLinks => level4InsightsLinks.path.includes("Assumptions")));
// Filter out duplicates from Assumptions linked to Level 4 Insights
level4InsightsAssumptions = dv.array(level4InsightsAssumptions).groupBy(p => dv.page(p).file.link).key.distinct();
// LEVEL 3 INSIGHTS
// Grab all directly-linked and indirectly-linked Level 3 Insights
let level3Insights = takeawayLinksLevelL3Insights.concat(level4InsightsLinksLevel3Insights);
// Filter out duplicates from level3Insights
level3Insights = dv.array(level3Insights).groupBy(p => dv.page(p).file.link).key.distinct();
// LEVEL 3 INSIGHTS - ALL LINKS
// Grab all links from Level 3 Insights
let level3InsightsLinks = dv.array(level3Insights).flatMap(p => dv.page(p).file.inlinks);
// LEVEL 3 INSIGHTS - LINKS TO OTHER INSIGHTS
// Filter out links from Level 3 Insights that are specific to other types of insights
let level3InsightsLinksLevel2Insights = Array.from(level3InsightsLinks.filter(level3InsightsLinks => level3InsightsLinks.path.includes("Level 2 Insights")));
let level3InsightsLinksLevel1Insights = Array.from(level3InsightsLinks.filter(level3InsightsLinks => level3InsightsLinks.path.includes("Level 1 Insights")));
// LEVEL 3 INSIGHTS - LINKS TO ASSUMPTIONS
// Grab all links to Assumptions from Level 3 Insights
let level3InsightsAssumptions = Array.from(level3InsightsLinks.filter(level3InsightsLinks => level3InsightsLinks.path.includes("Assumptions")));
// Filter out duplicates from Assumptions linked to Level 3 Insights
level3InsightsAssumptions = dv.array(level3InsightsAssumptions).groupBy(p => dv.page(p).file.link).key.distinct();
// LEVEL 2 INSIGHTS
// Grab all directly-linked and indirectly-linked Level 2 Insights
let level2Insights = takeawayLinksLevelL2Insights.concat(level4InsightsLinksLevel2Insights, level3InsightsLinksLevel2Insights);
// Filter out duplicates from level2Insights
level2Insights = dv.array(level2Insights).groupBy(p => dv.page(p).file.link).key.distinct();
// LEVEL 2 INSIGHTS - ALL LINKS
// Grab all links from Level 2 Insights
let level2InsightsLinks = dv.array(level2Insights).flatMap(p => dv.page(p).file.inlinks);
// LEVEL 2 INSIGHTS - LINKS TO OTHER INSIGHTS
// Filter out links from Level 2 Insights that are specific to other types of insights
let level2InsightsLinksLevel1Insights = Array.from(level2InsightsLinks.filter(level2InsightsLinks => level2InsightsLinks.path.includes("Level 1 Insights")));
// LEVEL 2 INSIGHTS - LINKS TO ASSUMPTIONS
// Grab all links to Assumptions from Level 2 Insights
let level2InsightsAssumptions = Array.from(level2InsightsLinks.filter(level2InsightsLinks => level2InsightsLinks.path.includes("Assumptions")));
// Filter out duplicates from Assumptions linked to Level 2 Insights
level2InsightsAssumptions = dv.array(level2InsightsAssumptions).groupBy(p => dv.page(p).file.link).key.distinct();
// LEVEL 1 INSIGHTS
// Grab all directly-linked and indirectly-linked Level 1 Insights
let level1Insights = takeawayLinksLevelL1Insights.concat(level4InsightsLinksLevel1Insights, level3InsightsLinksLevel1Insights, level2InsightsLinksLevel1Insights);
// Filter out duplicates from level1Insights
level1Insights = dv.array(level1Insights).groupBy(p => dv.page(p).file.link).key.distinct();
// LEVEL 1 INSIGHTS - ALL LINKS
// Grab all links from Level 1 Insights
let level1InsightsLinks = dv.array(level1Insights).flatMap(p => dv.page(p).file.inlinks);
// LEVEL 1 INSIGHTS - LINKS TO ASSUMPTIONS
// Grab all links to Assumptions from Level 1 Insights
let level1InsightsAssumptions = Array.from(level1InsightsLinks.filter(level1InsightsLinks => level1InsightsLinks.path.includes("Assumptions")));
// Filter out duplicates from Assumptions linked to Level 1 Insights
level1InsightsAssumptions = dv.array(level1InsightsAssumptions).groupBy(p => dv.page(p).file.link).key.distinct();
// SOURCE CONTENT
// Grab all links to Source Content from Level 1 Insights
let sourceContent = Array.from(level1InsightsLinks.filter(level1InsightsLinks => level1InsightsLinks.path.includes("Source Content")));
// Filter out duplicates from Source Content
sourceContent = dv.array(sourceContent).groupBy(p => dv.page(p).file.link).key.distinct();
// SOURCE CONTENT - ALL LINKS
// Grab all links from indirectly-linked Source Content
let sourceContentLinks = dv.array(sourceContent).flatMap(p => dv.page(p).file.inlinks);
// Filter out duplicates from sourceContentLinks
sourceContentLinks = dv.array(sourceContentLinks).groupBy(p => dv.page(p).file.link).key.distinct();
// STUDIES
// Grab all links to Studies from Source Content
let studies = Array.from(sourceContentLinks.filter(sourceContentLinks => sourceContentLinks.path.includes("Studies")));
// Filter out duplicates from studies
studies = dv.array(studies).groupBy(p => dv.page(p).file.link).key.distinct();
// PATENTS
// Grab all links to Patents from Source Content
let patents = Array.from(sourceContentLinks.filter(sourceContentLinks => sourceContentLinks.path.includes("Patents")));
// Filter out duplicates from studies
patents = dv.array(patents).groupBy(p => dv.page(p).file.link).key.distinct();
// PREPARATION FOR TABLES
level1Insights = dv.array(Array.from(level1Insights)).map(p => dv.page(p));
level1InsightsAssumptions = dv.array(Array.from(level1InsightsAssumptions)).map(p => dv.page(p));
level2Insights = dv.array(Array.from(level2Insights)).map(p => dv.page(p));
level2InsightsAssumptions = dv.array(Array.from(level2InsightsAssumptions)).map(p => dv.page(p));
level3Insights = dv.array(Array.from(level3Insights)).map(p => dv.page(p));
level3InsightsAssumptions = dv.array(Array.from(level3InsightsAssumptions)).map(p => dv.page(p));
level4Insights = dv.array(Array.from(level4Insights)).map(p => dv.page(p));
level4InsightsAssumptions = dv.array(Array.from(level4InsightsAssumptions)).map(p => dv.page(p));
sourceContent = dv.array(Array.from(sourceContent)).map(p => dv.page(p));
studies = dv.array(Array.from(studies)).map(p => dv.page(p));
patents = dv.array(Array.from(patents)).map(p => dv.page(p));
// TABLES
dv.table(["Studies", "Citation Key"], studies.map(p => [p.file.frontmatter.Citation, p.file.name]));
dv.table(["Patents", "Citation Key"], patents.map(p => [p.file.frontmatter.Citation, p.file.name]));
dv.table(["Level 1 Insights"], level1Insights.map(p => [p.file.name]));
dv.table(["Level 1 Insights - Assumptions"], level1InsightsAssumptions.map(p => [p.file.name]));
dv.table(["Level 2 Insights"], level2Insights.map(p => [p.file.name]));
dv.table(["Level 2 Insights - Assumptions"], level2InsightsAssumptions.map(p => [p.file.name]));
dv.table(["Level 3 Insights"], level3Insights.map(p => [p.file.name]));
dv.table(["Level 3 Insights - Assumptions"], level3InsightsAssumptions.map(p => [p.file.name]));
dv.table(["Level 4 Insights"], level4Insights.map(p => [p.file.name]));
dv.table(["Level 4 Insights - Assumptions"], level4InsightsAssumptions.map(p => [p.file.name]));
```
The code will grab links step-wise starting at Takeaways and ending at Studies/ Patents. It’s also set up to grab Assumptions specifically from where they are linked in the structure. Then it creates tables for everything at the end so I can call a single script and generate everything for a takeaway. This is a current illustration of how the hierarchy is set up right now:
I’m sure the code can be made much more efficient. But at least it seems to be working now