Neo4j 使用Cypher从树返回嵌套的分层JSON
我目前正在使用console.neo4j.org上的示例数据编写一个输出分层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
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,改变了我的生活和自由时间!