使用 Neo4j 将子树节点收集为单独的列表

问题描述

我正在尝试创建一个 cypher,它收集子树节点(这些子树节点属于 Story 类型)并将它们作为单独的列表返回。每棵树都从一个家庭节点开始,连接到用户节点,然后依次连接到故事节点。

澄清一下,有多个树,我试图收集所有的 Story 节点,结构如下:

{
FamilyOne: Stories:[...],FamilyTwo: Stories:[...]
}

Here is what the database structure looks like

解决方法

这样的事情应该可以工作:

MATCH (f:Family)
CALL {
 WITH f
 MATCH (f)<-[*]-(s:Story)
 RETURN f,collect(DISTINCT s) as Stories
}
RETURN f.name as family,Stories

尽管这样可以让你每行一个家庭(我不知道你的财产是什么,所以我猜),以及每个家庭的故事。

如果你想要一个以姓氏为键的地图结构,那么你需要APOC程序:

MATCH (f:Family)
CALL {
 WITH f
 MATCH (f)<-[*]-(s:Story)
 WITH f,collect(DISTINCT s) as Stories
 RETURN [f.name,f {Stories}] as familyInfo
}
WITH collect(familyInfo) as familyData
RETURN apoc.map.fromPairs(familyData) as results

另一种方法是尝试 APOC 路径扩展器来获取故事:

MATCH (f:Family)
CALL {
 WITH f
 CALL apoc.path.subgraphNodes(f,{labelFilter:'/Story',relationshipFilter:'<'}) YIELD node as s
 WITH f,collect(s) as Stories
 RETURN [f.name,f {Stories}] as familyInfo
}
WITH collect(familyInfo) as familyData
RETURN apoc.map.fromPairs(familyData) as results