【问题标题】:Neo4j: Return subtrees in CypherNeo4j:在 Cypher 中返回子树
【发布时间】:2020-07-22 12:41:16
【问题描述】:

我有一个像这样的图形数据库

有没有办法将两个子树返回为不包括“B”关系的树结构?我的愿望是生成一个 JSON 描述两个子树的层次结构,格式如下

{
  "graph":{
    "food": {
      "attr1":"some attr",
      "children": {
        "pizza":{
          "attr1":"some attr",
          "children":{
            "pizza1":{
              "attr1":"some attr"
            },
            "pizza2":{
              "attr1":"some attr"
            },
            "pizza3":{
              "attr1":"some attr"
            }
          }
        },
        "pie":{
          "attr1":"some attr",
          "children":{}}
      }
    },
    "topping": {
      "attr1":"some attr",
      "children": {
        "meat":{
          "attr1":"some attr",
          "children":{
            "pepperoni":{
              "attr1":"some attr"
            },
            "beef":{
              "attr1":"some attr"
            }
          }
        },
        "vegetables":{
          "attr1":"some attr",
          "children":{
            "onion":{
              "attr1":"some attr"
            },
            "eggplant":{
              "attr1":"some attr"
            }
          }
        }
      }
    }
  }
}

我知道 Neo4j 有 APOC 插件,但我不知道它是否可以用于这样的事情。

【问题讨论】:

    标签: json graph neo4j tree cypher


    【解决方案1】:

    APOC 过程apoc.convert.toTree 可以生成每个子树(但使用通用 JSON 模式)。例如:

    MATCH p=(f:Foo)-[:A*0..]->(:Foo)
    WHERE f.id IN ['FOOD', 'TOPPING']
    WITH COLLECT(p) AS ps
    CALL apoc.convert.toTree(ps, false) YIELD value
    RETURN value AS subtree
    

    [更新 1]

    如果FOODTOPPING 不是属性值而是标签,您可以这样做:

    MATCH p=(f)-[:A*0..]->()
    WHERE f:FOOD OR f:TOPPING
    WITH COLLECT(p) AS ps
    CALL apoc.convert.toTree(ps, false) YIELD value
    RETURN value AS subtree
    

    [更新 2]

    如果您还想忽略每个路径上的叶节点(至少有 1 个关系),您可以使用 APOC 函数apoc.path.slice 来消除路径中的最后一个关系:

    MATCH p=(f)-[:A*0..]->()
    WHERE f:FOOD OR f:TOPPING
    WITH COLLECT(CASE WHEN LENGTH(p) > 0 THEN apoc.path.slice(p, 0, LENGTH(p)-1) ELSE p END) AS ps
    CALL apoc.convert.toTree(ps, false) YIELD value
    RETURN value AS subtree
    

    【讨论】:

    • 在我的例子中,“FOOD”和“TOPPING”是标签。有没有办法像属性一样过滤标签?
    • 谢谢。有没有办法不归还叶子?我的意思是返回相同的 json 结构只是 FOOD、PIZZA、TOPPING、MEAT 和蔬菜?
    • 查看我的更新答案。以后,您应该创建一个新问题。
    • 谢谢。如何使用 convert.toTree 直接导出到 json 文件?
    • 查看exporting to JSON files 的 APOC 程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多