neo4j 返回格式化的JSON查询具有两种不同关系的树(cypher)

6qfn3psc  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(205)

我有一个包含“块”的树状结构,这些块通过“NEXT_BLOCK”或“BLOCK_CHILD”连接到其他块。一个节点最多可以有一个BLOCK_CHILD和一个NEXT_BLOCK,并且这可以递归地重复自身。

虽然我可以通过运行下面的密码从starter节点获得所有块,但我希望以特定的数据格式获得数据。

MATCH (n:Node {id: $nodeId})-[r:NEXT_BLOCK|BLOCK_CHILD*0..]-(b:BLOCK_ELEMENT|BLOCK_INLINE)
RETURN n, r, b

我需要有效地将这个数据树作为一个数组,其中每个“Next block”是数组中的下一个元素,而“BLOCK_CHILD”的所有部分(包括其下一个节点)都封装在一个子字段中,该子字段也是一个数组。因此,上面的例子将被给出为

[
  {
  id : "4fa9125.."
  children : [{text: ""}]
  }, 
  {
  id : "66fb771.."
  children : [
                    {
                      id: "466a6a"
                      children: [{id: "5498a3"}]
                    },
                    {
                      id: "90753..."
                      children: []
                    },
              ]
  }, 
  {
  id : "12258d5.."
  children : [{id: "97b56a"}]
  }, 
]

如果我的节点有更好的结构设计,组织仍然可以改变。这些需要正确排序,但顺序会经常改变。
谢谢你的帮助!
我尝试使用APOC.convertToTree作为下面的示例。

MATCH path = (n {id: "eecd1592-d41b-4b3c-aaa1-16562d808ecc"})-[r:BLOCK_CHILD|NEXT_BLOCK*0..]->(p)
WITH collect(path) AS paths
CALL apoc.convert.toTree(paths)
YIELD value
RETURN value;

我也尝试了一些结构上的改变,比如存储json对象,但是由于它经常被改变,块总是被交叉引用,所以我不想简单地将整个内容存储为字符串。

5vf7fwbs

5vf7fwbs1#

上次我做了这样的导出,我使用了apoc.export.json.query。该过程使用查询的结果并将其导出为JSON。根据您想要的JSON格式,您可能需要运行几个工具来删除额外的转义字符等(tr、sed等)。我相信我在上面运行了tr -d '\' file来删除多余的反斜杠。

相关问题