2016-03-26 2 views
2

Во-первых, заблаговременно за это прочитайте. Во-вторых, извините заранее за длинный пост, но я надеюсь, что как хорошо написанная функция, хороший материал наверху, хотя, пожалуйста, найдите время, чтобы прочитать все. В-третьих, я потерял информацию о том, сколько вопросов о стеке я просмотрел - если это все еще вопрос о нобе, я приношу свои извинения.Разборный комплекс JSON от Neo4j

Я использую Node.js для предоставления api для моего клиента AngularJS. Вся моя агрегировка и преобразование данных будут выполняться в узле и представлять клиенту плоскую структуру данных JSON.

У меня есть модель Neo4j, которая связывает меня с приложениями, за которые я несу ответственность, и связывает технические риски со всеми приложениями. У меня есть хороший запрос Cypher, который показывает мне технические риски только для приложений, за которые я несу ответственность, и исключает все мои другие приложения, которые не имеют никакого риска. Вот мой результат: Neo4j Graph result.

Вот мой код Node.js (routes.js файл называется основным файлом api.js):

var router = require('express').Router(); 
var neo4j = require('neo4j'); 
var db = new neo4j.GraphDatabase('http://user:[email protected]: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: array меня пугает. Я начал разворачивать его вручную (попытка разбиения и сращивания со строками и объектами соответственно), но я считаю, что он должен быть доступен с помощью парсера json. Когда я использую следующие как тест:

var tmpResult1 = JSON.stringify(result.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 - «около 49 300 результатов» (!!!), а 30+ я смотрел, что все они имеют дело с простыми структурами и используют «Кино» в качестве примера.

Снова спасибо за это! Я ценю любую помощь или подсказки.

ответ

0

Я думаю, что вы смущены выводами console.log(), это всего лишь короткое представление, оно не всегда показывает целостность объекта (например, [Object] означает, что есть внутренний сложный объект). results - объект не строка JSON, сделайте console.log(typeof results);, и он выведет object.

Вы можете использовать console.log(JSON.stringify(results, null, 3));, чтобы отобразить весь объект, это поможет вам пройти объект, видя, где именно вам нужно (это только для отладки). Затем вам не нужно разбирать или сращивать/разбивать что-либо, так как result - это действительный объект JS, его строение только делает вещи намного сложнее. Например, попробуйте console.log(results[0].n[0].properties.lastName);, он должен отображать MacDonald.

+0

Я пробовал и получил следующую ошибку: console.log (result [0] .n [0] .properties.lastName); ^ TypeError: Не удается прочитать свойство 'п' неопределенной в D: \ Development \ ps_jwt \ апи \ routes.js: 205: 34 в D: \ Development \ ps_jwt \ апи \ node_modules \ Neo4j \ Lib новый \ GraphDatabase.js: 301: 18 Я включил ответ о том, как я в конечном итоге работал через стек массивов и объектов, хотя это все еще не лучшее решение. Благодаря! –

+0

@BruceMacDonald Я забыл 's' в результате. Я отредактировал свой ответ. – Shanoor

+0

добавление сработало. Я согласен, что ответ, который я придумал, был запутан. Мне нужны почти все свойства трех узлов и 2 отношения, которые возвратили результаты. Спасибо, что упростили это! –

0

После хорошего ночного сна я подумал, что я возьму еще одну трещину. Я постепенно прошел через массив объектов массивов объектов и т. Д. ... и вот что я получил - вот мое новое условие ...

EDIT: Я забыл упомянуть, что в итоге я использовал библиотеку 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 должен использовать параметры, чтобы я мог передавать разные пользователи и т. Д.).

Ибо, где я нахожусь в цикле разработки, мне кажется, что я продвигаюсь вперед.

Cheers!

+0

Это сложный путь для очень простой проблемы, * results * - это объект, который использует его. Кроме того, какие свойства вы ищете точно? – Shanoor

2

Я написал библиотеку специально для этой цели:

https://www.npmjs.com/package/parse-neo4j

Он разбирает выход Neo4j и извлекает только то, что было возвращено в запросе, увидеть, если это помогает!

Neo4j's http endpoint produces result that contains complete query information.

parse-neo4j helps those who only want what they've returned in the query as normal JSON.