问题描述
我正在尝试创建一个 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