Javascript 解析来自Neo4j的复杂JSON结果

Javascript 解析来自Neo4j的复杂JSON结果,javascript,json,node.js,neo4j,Javascript,Json,Node.js,Neo4j,首先,提前感谢您阅读本文。 第二,提前为这篇冗长的文章感到抱歉——但我希望像一个写得很好的函数一样,好东西在顶部——尽管请花时间阅读所有内容。 第三,我已经记不清我看过多少堆问题了——如果这仍然是一个noob问题,我道歉 我正在使用Node.js为我的AngularJS客户端提供api。我所有的数据聚合和转换都将在Node中完成,并向客户端呈现一个平面JSON数据结构 我有一个Neo4j模型,它将我与我负责的应用程序联系起来,并将技术风险与所有应用程序联系起来。我有一个很好的密码查询,它只显示了

首先,提前感谢您阅读本文。 第二,提前为这篇冗长的文章感到抱歉——但我希望像一个写得很好的函数一样,好东西在顶部——尽管请花时间阅读所有内容。 第三,我已经记不清我看过多少堆问题了——如果这仍然是一个noob问题,我道歉

我正在使用Node.js为我的AngularJS客户端提供api。我所有的数据聚合和转换都将在Node中完成,并向客户端呈现一个平面JSON数据结构

我有一个Neo4j模型,它将我与我负责的应用程序联系起来,并将技术风险与所有应用程序联系起来。我有一个很好的密码查询,它只显示了我负责的应用程序的技术风险,并排除了所有其他没有风险的应用程序。下面是我查询结果的图片: .

以下是我的node.js代码(主api.js文件调用的文件routes.js):

上面的代码生成以下JSON(为了可读性,在块中添加了分隔符) 产生以下结果:

- - - - console.log(results); - - - -

[ { n: [ [Object], [Object], [Object] ],
    m: [ [Object], [Object] ] },
  { n: [ [Object], [Object], [Object] ],
    m: [ [Object], [Object] ] },
  { n: [ [Object], [Object], [Object] ],
    m: [ [Object], [Object] ] },
  { n: [ [Object], [Object], [Object] ],
    m: [ [Object], [Object] ] },
  { n: [ [Object], [Object], [Object] ],
    m: [ [Object], [Object] ] } ]

- - - - console.log(results[0]); - - - -

{ n:
   [ Node { _id: 585, labels: [Object], properties: [Object] },
     Node { _id: 675, labels: [Object], properties: [Object] },
     Node { _id: 695, labels: [Object], properties: [Object] } ],
  m:
   [ Relationship {
       _id: 845,
       type: 'ARCHITECT_FOR',
       properties: [Object],
       _fromId: 585,
       _toId: 675 },
     Relationship {
       _id: 813,
       type: 'HAS_RISK',
       properties: [Object],
       _fromId: 675,
       _toId: 695 } ] }

- - - - console.log(results[1]); - - - -

{ n:
   [ Node { _id: 585, labels: [Object], properties: [Object] },
     Node { _id: 674, labels: [Object], properties: [Object] },
     Node { _id: 689, labels: [Object], properties: [Object] } ],
  m:
   [ Relationship {
       _id: 844,
       type: 'ARCHITECT_FOR',
       properties: [Object],
       _fromId: 585,
       _toId: 674 },
     Relationship {
       _id: 810,
       type: 'HAS_RISK',
       properties: [Object],
       _fromId: 674,
       _toId: 689 } ] }
n:阵列让我很困惑。我开始手动拆分它(分别尝试使用字符串和对象拆分和拼接),但我相信它必须可以使用json解析器访问。当我使用以下内容作为测试时:

var tmpResult1 = JSON.stringify(result.n);
我得到了n的一个很好的字符串表示:

[{"_id":585,"labels":["Person"],"properties":{"hrpno":"00061627","lastName":"MacDonald","title":"Consultant, IT Architecture","hrdno":"104134","shortname":"macdonb","role":"Systems Architect","displayName":"Bruce MacDonald","firstName":"Bruce"}},{"_id":650,"labels":["Application"],"properties":{"dateverified":"2016-01-19","name":"Portal - Loss Runs","aprmid":"aprm1249"}},{"_id":683,"labels":["TechRisk"],"properties":{"status":"Documented","riskid":"ABC-2012-082","dateEntered":"2012-06-29"}}]
字符串很好,但当我尝试使用点或括号引用数组时,会出现很多“未定义”错误

我有点迷路了,准备再休息一两天。我在YouTube上查找了教程-“大约49300个结果”(!!!),在我查看的30多个结果中,它们都涉及简单的结构,并以“电影”为例


再次感谢您阅读本文!非常感谢您提供的帮助或线索。

我想您可能被
控制台.log()
输出搞糊涂了,它只是一个简短的表示,并不总是显示对象的整体(例如
[object]
表示存在内部复杂对象)
results
是一个对象而不是JSON字符串,执行
console.log(typeof results)并将输出
对象


您可以使用
console.log(JSON.stringify(results,null,3))
要显示整个对象,它将帮助您通过查看所需属性的确切位置来遍历对象(这只是为了调试)。接下来,您不需要解析或拼接/拆分任何内容,因为
result
是一个有效的JS对象,将其字符串化只会让事情变得更加困难。例如,尝试
console.log(结果[0].n[0].properties.lastName)
,它应该会显示
MacDonald

在睡了一个好觉之后,我想我会再试试这个。我循序渐进地走过一排排的物体,一排排的物体等等。。。这是我最后的结果-这是我的新情况

编辑:我忘了提到我最终使用了洛达斯图书馆

} else {
    var TechRisk = [];
    for ( var i = 0, len = results.length; i < len; ++i) {
        TechRisk.push(_.defaults(_.get((_.get(results[i], 'n')[0]), 'properties'),_.get((_.get(results[i], 'n')[1]), 'properties'),_.get((_.get(results[i], 'n')[2]), 'properties'),_.get((_.get(results[i], 'm')[0]), 'properties'),_.get((_.get(results[i], 'm')[1]), 'properties')));
    }
    res.status(200).send(TechRisk);
}
}其他{
var TechRisk=[];
对于(变量i=0,len=results.length;i
如果有人有更优雅的方法来处理我的嵌套对象组,请告诉我。这是一种蛮力,而且非常脆弱(我的密码查询需要使用参数,以便我可以传入不同的用户,等等)

对于我在开发周期中所处的位置,它让我向前迈进


干杯

我专门为此编写了一个库:

它解析Neo4j的输出,只提取查询中返回的内容,看看是否有用

Neo4j的http端点生成包含完整查询信息的结果

parse-neo4j帮助那些只希望查询中返回的内容作为普通JSON的人


我尝试了它并得到了以下错误:console.log(结果[0].n[0].properties.lastName);^TypeError:无法读取D:\Development\ps\u jwt\api\routes.js:205:34处未定义的属性'n',D:\Development\ps\u jwt\api\node\u modules\neo4j\lib new\GraphDatabase.js:301:18我给出了最终如何处理数组和对象堆栈的答案,尽管它仍然不是最佳解决方案。谢谢@结果我忘了
s
。我编辑了我的答案。添加s有效。我同意我提出的答案很复杂。我需要结果返回的3个节点和2个关系的几乎所有属性。谢谢你简化了这个!对于一个非常简单的问题来说,这是一种复杂的方式,结果是一个对象,使用它。还有,你到底在找什么房产?
} else {
    var TechRisk = [];
    for ( var i = 0, len = results.length; i < len; ++i) {
        TechRisk.push(_.defaults(_.get((_.get(results[i], 'n')[0]), 'properties'),_.get((_.get(results[i], 'n')[1]), 'properties'),_.get((_.get(results[i], 'n')[2]), 'properties'),_.get((_.get(results[i], 'm')[0]), 'properties'),_.get((_.get(results[i], 'm')[1]), 'properties')));
    }
    res.status(200).send(TechRisk);
}