Neo4j 返回嵌套的 JSON

9

我的Neo4j数据库包含家族谱系关系。

我想以嵌套JSON格式提取这些数据,如下所示:

{  
"firstname":"Jon",
"lastname":"Smith",
"parents":[  
  {  
     "firstname":"Anna",
     "lastname":"Smith",
     "parents":[  
        {  
           "furstname":"Peter",
           "lastname":"Doe",
           "parents":[  
              {  
                 "firstname":"Jessica",
                 "lastname":"Doe"
              },
              {  
                 "firstname":"Clayton",
                 "lastname":"Doe"
              }
           ]
        },
        {  
           "firstname":"Nell",
           "lastname":"Gordon",
           "parents":[  
              {  
                 "firstname":"Jessica",
                 "lastname":"Roberts"
              },
              {  
                 "firstname":"Randy",
                 "lastname":"Roberts"
              }
           ]
        }
     ]
  }
]
}

为了可视化它,我尝试了以下查询:

in order to visualize it.

MATCH path = (p:Person)-[r:PARENT_OF*1..3]-(k:Person) 
WHERE k.id = '1887' 
UNWIND r as rel 
RETURN StartNode(rel).firstname, rels(path), EndNode(rel).firstname

您可以使用py2neo库来实现:

dumps(graph.run(query).data())

但是JSON嵌套的方式不符合我的要求。

是否有查询可以帮助我实现这一点,或者我应该在其他编程语言中进行嵌套?


1
https://neo4j.com/blog/cypher-graphql-neo4j-3-1-preview/ 这篇文章可能会对您有所帮助,让您了解如何返回嵌套的JSON。 - Tomaž Bratanič
2
请查看 https://dev59.com/P5nga4cB1Zd3GeqPV0BO ... apoc 有一个相应的过程。 - Tom Geudens
1个回答

15

如评论所述,您可以使用APOC Procedure apoc.convert.toTree。请看:

1 - 基于您的问题创建一个示例数据集:

CREATE (jonsmith:Person {firstname:"Jon", lastname:"Smith"})
CREATE (annasmith:Person {firstname:"Anna", lastname:"Smith"})
CREATE (peterdoe:Person {firstname:"Peter", lastname:"Doe"})
CREATE (jessicadoe:Person {firstname:"Jessica", lastname:"Doe"})
CREATE (claytondoe:Person {firstname:"Clayton", lastname:"Doe"})
CREATE (nellgordon:Person {firstname:"Nell", lastname:"Gordon"})
CREATE (jessicaroberts:Person {firstname:"Jessica", lastname:"Roberts"})
CREATE (randyroberts:Person {firstname:"Randy", lastname:"Roberts"})

CREATE (jonsmith)-[:PARENT_OF]->(annasmith)
CREATE (annasmith)-[:PARENT_OF]->(peterdoe)
CREATE (annasmith)-[:PARENT_OF]->(nellgordon)
CREATE (peterdoe)-[:PARENT_OF]->(jessicadoe)
CREATE (peterdoe)-[:PARENT_OF]->(claytondoe)
CREATE (nellgordon)-[:PARENT_OF]->(jessicaroberts)
CREATE (nellgordon)-[:PARENT_OF]->(randyroberts)

2 - 运行查询:

MATCH path = (jon:Person {firstname:'Jon', lastname:'Smith'})-[:PARENT_OF*]-(:Person)
WITH collect(path) as paths
CALL apoc.convert.toTree(paths) yield value
RETURN value;

3 - 结果如下:

{
  "_type": "Person",
  "_id": 9,
  "firstname": "Jon",
  "lastname": "Smith",
  "parent_of": [
    {
      "_id": 10,
      "_type": "Person",
      "firstname": "Anna",
      "lastname": "Smith",
      "parent_of": [
        {
          "_id": 11,
          "_type": "Person",
          "firstname": "Peter",
          "lastname": "Doe",
          "parent_of": [
            {
              "_id": 12,
              "_type": "Person",
              "firstname": "Jessica",
              "lastname": "Doe"
            },
            {
              "_id": 13,
              "_type": "Person",
              "firstname": "Clayton",
              "lastname": "Doe"
            }
          ]
        },
        {
          "_id": 14,
          "_type": "Person",
          "firstname": "Nell",
          "lastname": "Gordon",
          "parent_of": [
            {
              "_id": 15,
              "_type": "Person",
              "firstname": "Jessica",
              "lastname": "Roberts"
            },
            {
              "_id": 16,
              "_type": "Person",
              "firstname": "Randy",
              "lastname": "Roberts"
            }
          ]
        }
      ]
    }
  ]
}

请根据您使用的Neo4j版本安装APOC程序。查看版本兼容矩阵


1
我一直在尝试使用apoc.convert.toTree。你提供的示例可以正常工作,但是当我像这样尝试将其应用于我的数据时:`MATCH p=(n:Person)-[r:PARENT_OF*]-(m:Person) WHERE n.id='1887' WITH COLLECT(p) AS ps CALL apoc.convert.toTree(ps) yield value RETURN value;`查询会一直运行。如果我将图形定向如下:MATCH p=(n:Person)-[r:PARENT_OF*]->(m:Person),那么我只能得到具有id:1887的人及其子孙后代,但我无法得到该人的父母。我需要一种方法来嵌套所有的PARENT_OF节点。 - Porjaz
@Porjaz,你的第一个查询一直在运行,因为你正在从一个节点开始朝着所有方向和任意深度遍历图。也就是说,这是对图进行非常昂贵的操作。那么,限制深度怎么样(例如像 [:PARENT_OF*1..3] 这样)? - Bruno Peres
它只能使用[:PARENT_OF*1..2],但这样我无法获取所有的关系。我可能会编写一个自定义脚本来正确嵌套关系。 - Porjaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接