首页 > 解决方案 > 使用 Neo4j 将子树节点收集为单独的列表

问题描述

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

为了澄清,有多个树,我试图收集所有故事节点,结构如下:

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

这是数据库结构的样子

标签: databasegraphneo4j

解决方案


像这样的东西应该工作:

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

推荐阅读