neo4j Cypher查询,在节点树的每一级获取嵌套的节点数组

smdnsysy  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一系列的评论和回复,每个评论可以有多个回复,每个回复又可以有任何数量的嵌套或即时回复。
以下是一些图表示例数据:

在这里,我有一个帖子,有4条评论,每条评论都回复了前面的评论,我想写一个查询,这样我就可以像这样将它们作为嵌套列表返回

Post = {
   ...
   comments: [
      comment: {
          ...
          replies: [
              comment: {
                  ...
                  replies: [
                      comment : {
                         etc
                  ]
              }
          ]
      }
   ]
}

每个评论都有一个回复列表,每个回复都有回复,你就明白了
我对使用cypher非常陌生,我更熟悉mongoDB,所以这是我目前为止的查询

MATCH tree1 = (post:POST)<-[:COMMENTED_ON]-(comment:COMMENT)
OPTIONAL MATCH tree2 = (comment)<-[replied_to:REPLIED_TO *]-(reply:COMMENT)
WHERE ID(post) = 5
RETURN nodes(tree1), nodes(tree2)

它得到所有的节点,但它只是节点的列表,有很多重复,我已经做了很多谷歌搜索,我看了FOREACH功能,但我不确定我如何正确地应用它在这里。我几乎可以肯定地写一个查询,然后我可以使用代码将其转换为我需要的结构,但如果我能写一个查询来为我做这件事,或者至少是一个以更容易做到的格式返回节点的查询,那就太好了

ryhaxcpt

ryhaxcpt1#

此查询使用APOC过程apoc.convert.toTree生成树:

MATCH p = (post:POST)<-[:COMMENTED_ON]-(:COMMENT)-[:REPLIED_TO|COMMENTED_ON *0..]-(:COMMENT)
WHERE ID(post) = 5
WITH COLLECT(p) AS paths
CALL apoc.convert.toTree(paths) YIELD value
RETURN value

阅读the docs,了解如何配置生成的树中包含或排除的属性。

相关问题