解析Neo4j的复杂JSON结果

时间:2016-03-26 01:06:59

标签: javascript json node.js neo4j

首先,提前感谢您阅读本文。 第二,对于长篇文章提前抱歉 - 但我希望像一个写得很好的功能,好的东西在顶部 - 虽然请花时间阅读所有内容。 第三,我已经忘记了我已经查看了多少堆栈问题 - 如果这仍然是一个noob问题我道歉。

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

我有一个Neo4j模型,它将我与我负责的应用程序联系起来,并将技术风险与所有应用程序联系起来。我有一个很好的Cypher查询,它向我展示了我所负责的应用程序的技术风险,并排除了我没有任何风险的所有其他应用程序。这是我查询结果的图片: Neo4j Graph result

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

var router = require('express').Router();
var neo4j = require('neo4j');
var db = new neo4j.GraphDatabase('http://user:password@localhost:7474');

router.get('/techrisks', getTechRisks);

module.exports = router;

function getTechRisks(req, res) {

    db.cypher({
        query: 'MATCH p=(a)-[e:ARCHITECT_FOR]->(b)-[d:HAS_RISK]->(c) WHERE a.shortname="macdonb" RETURN nodes(p) AS n,relationships(p) AS m',
         params: {

        }
    }, function (err, results) {

        if (err) { throw err; }
        var result = results[0];
        if (!result) {
            console.log('No TechRisk found.');
        } else {
            console.log(results);
            console.log(results[0]);
            console.log(results[1]);
        }
    });
}

上面的代码生成以下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"}}]

字符串很好但是当我尝试用点或括号引用数组时,我得到了很多" undefined"错误。

我有点失落,准备好再度一两天。我在YouTube上寻找过教程 - "大约49,300个结果" (!!!)和30多岁的我看过他们都处理简单的结构并使用"电影"作为例子。

再次感谢您阅读这篇文章!我感谢任何帮助或线索。

3 个答案:

答案 0 :(得分:2)

我专门为此目的编写了一个图书馆:

Attempted to use awk sqrt but only returns 0

它解析Neo4j的输出并仅提取查询中返回的内容,看看它是否有帮助!

  

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

     

parse-neo4j帮助那些只想在查询中返回的内容为普通JSON的人。

答案 1 :(得分:0)

我认为您对console.log()输出感到困惑,它只是一个简短的表示,它并不总是显示整个对象(例如{{1}意味着有一个内部复杂的对象)。 [Object]是一个对象而不是JSON字符串,执行results并输出console.log(typeof results);

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

答案 2 :(得分:0)

经过一夜安眠之后,我想我会再接受一次破解。我逐渐走遍了物体阵列等物体的阵列......这就是我最终得到的结果 - 这是我新的其他条件......

编辑:我忘了提到我最终使用了lodash库。

} 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);
}

如果有人有更优雅的方式来处理我的嵌套对象组,请告诉我。这有点蛮力而且非常脆弱(我的Cypher查询需要利用params,所以我可以传入不同的用户等)。

对于我在开发周期中的位置,它让我前进。

干杯!