Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 使用Cypher从树返回嵌套的分层JSON_Neo4j_Cypher - Fatal编程技术网

Neo4j 使用Cypher从树返回嵌套的分层JSON

Neo4j 使用Cypher从树返回嵌套的分层JSON,neo4j,cypher,Neo4j,Cypher,我目前正在使用console.neo4j.org上的示例数据编写一个输出分层JSON的查询 示例数据是用 create (Neo:Crew {name:'Neo'}), (Morpheus:Crew {name: 'Morpheus'}), (Trinity:Crew {name: 'Trinity'}), (Cypher:Crew:Matrix {name: 'Cypher'}), (Smith:Matrix {name: 'Agent Smith'}), (Architect:Matrix

我目前正在使用console.neo4j.org上的示例数据编写一个输出分层JSON的查询

示例数据是用

create (Neo:Crew {name:'Neo'}), (Morpheus:Crew {name: 'Morpheus'}), (Trinity:Crew {name: 'Trinity'}), (Cypher:Crew:Matrix {name: 'Cypher'}), (Smith:Matrix {name: 'Agent Smith'}), (Architect:Matrix {name:'The Architect'}),
(Neo)-[:KNOWS]->(Morpheus), (Neo)-[:LOVES]->(Trinity), (Morpheus)-[:KNOWS]->(Trinity),
(Morpheus)-[:KNOWS]->(Cypher), (Cypher)-[:KNOWS]->(Smith), (Smith)-[:CODED_BY]->(Architect)
理想的输出如下

name:"Neo"
children: [
  { 
    name: "Morpheus",
    children: [
      {name: "Trinity", children: []}
      {name: "Cypher", children: [
        {name: "Agent Smith", children: []}
      ]}
    ]
  }
]
}
现在,我使用以下查询

MATCH p =(:Crew { name: "Neo" })-[q:KNOWS*0..]-m
RETURN extract(n IN nodes(p)| n)
得到这个

[(0:Crew {name:"Neo"})]
[(0:Crew {name:"Neo"}), (1:Crew {name:"Morpheus"})]
[(0:Crew {name:"Neo"}), (1:Crew {name:"Morpheus"}), (2:Crew {name:"Trinity"})]
[(0:Crew {name:"Neo"}), (1:Crew {name:"Morpheus"}), (3:Crew:Matrix {name:"Cypher"})]
[(0:Crew {name:"Neo"}), (1:Crew {name:"Morpheus"}), (3:Crew:Matrix {name:"Cypher"}), (4:Matrix {name:"Agent Smith"})]

有什么办法可以解决这个问题吗?感谢neo4j 3.x中的

,在neo4j服务器上安装后,您可以调用apoc.convert.toTree过程来生成类似的结果

例如:

MATCH p=(n:Crew {name:'Neo'})-[:KNOWS*]->(m)
WITH COLLECT(p) AS ps
CALL apoc.convert.toTree(ps) yield value
RETURN value;
。。。将返回如下所示的结果行:

    {
      "_id": 127,
      "_type": "Crew",
      "name": "Neo",
      "knows": [
        {
          "_id": 128,
          "_type": "Crew",
          "name": "Morpheus",
          "knows": [
            {
              "_id": 129,
              "_type": "Crew",
              "name": "Trinity"
            },
            {
              "_id": 130,
              "_type": "Crew:Matrix",
              "name": "Cypher",
              "knows": [
                {
                  "_id": 131,
                  "_type": "Matrix",
                  "name": "Agent Smith"
                }
              ]
            }
          ]
        }
      ]
    }

这是一条关于这个重要主题的非常有用的线索,我想在深入研究之后,我会补充一些想法

首先,使用APOC“toTree”程序有一些限制,或者说是依赖性。你的架构有多“树状”,这真的很重要。例如,上面的APOC调用中缺少LOVES关系,我理解为什么使用“toTree”时很难包含这种关系,简单的添加有点像在层次结构中添加属性,但作为一种关系。做得不错,但会混淆简单的知识树。重点是,一个好问题是“我如何应对这些挑战”。这个答复是关于这一点的

我确实建议您提高JSON技能,因为这将为您提供更细粒度的控制。就我个人而言,我发现我最初的探索有些痛苦。可能是因为我是一个XML人:),但一旦你弄清楚所有的[,{,和('s),这确实是一个有效的方法,可以有效地获取数据报告。鉴于JSON可以很容易地成为一个类,它允许一个很好的方法将其推回到你的应用程序中


我发现perf对“toTree”也是一个挑战我在下面添加了一个非常简单的视图,看看你的回报会是什么样子。它遵循以下BN格式。我很想看到它更成熟地创建,因为可能性很大,但这是我发现有用的东西,因此我现在就发布这个不成熟的版本。正如他们所说;“让读者更深入地了解”给出了该名称的历史。是的。我指的是这个问题中的示例也是来自矩阵的事实。这是APOC插件迄今为止最强大的功能(至少对我来说是如此),并且很容易将Neo4j图像引入Docker(见文档),如果使用docker compose,请使用卷:-:/plugins,“build”然后是“up”。感谢分享@cybersam,改变了我的生活和自由时间!