2016-03-26 10 views
2

Zuerst, Vielen Dank im Voraus für das Lesen dieser. Zweitens, Sorry im Voraus für die lange Post - aber ich hoffe, wie eine gut geschriebene Funktion, das gute Zeug ist an der Spitze - obwohl bitte nehmen Sie sich die Zeit, um alles zu lesen. Drittens habe ich den Überblick verloren, wie viele Stapelfragen ich durchgesehen habe - wenn das immer noch eine Frage ohne Frage ist, entschuldige ich mich.Parsing Komplex JSON Ergebnisse von Neo4j

Ich verwende Node.js, um APIs für meinen AngularJS-Client bereitzustellen. Alle meine Datenaggregation und -transformation wird in Node durchgeführt und dem Client eine flache JSON-Datenstruktur präsentieren.

Ich habe ein Neo4j-Modell, das mich mit den Anwendungen, für die ich verantwortlich bin, in Verbindung bringt und technische Risiken mit allen Anwendungen in Verbindung bringt. Ich habe eine nette Cypher-Abfrage, die mir die technischen Risiken nur für die Anwendungen zeigt, für die ich verantwortlich bin, und schließt alle meine anderen Apps aus, die kein Risiko darstellen. Hier ist ein Bild meiner Abfrageergebnisse: Neo4j Graph result.

Hier ist meine node.js Code (Datei routes.js durch die Haupt api.js Datei genannt):

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

Der obige Code erzeugt die folgende JSON (mit Separatoren zu den Stücken für Lesbarkeit hinzugefügt) produziert wird diese Ergebnisse:

- - - - 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 } ] } 

Die n: array mir Verwechselung. Ich fing an, es manuell auseinander zu reißen (versuche Split und Spleiß mit Strings und Objekten), aber ich glaube, dass es zugänglich sein muss mit einem JSON-Parser. Wenn ich den folgenden als Test verwenden:

var tmpResult1 = JSON.stringify(result.n); 

ich eine große String-Darstellung von 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"}}] 

Der String ist schön, aber wenn ich versuche, das Array mit Punkten oder Klammern zu verweisen ich viele "undefinierte" Fehler.

Ich bin ein wenig verloren und bereit, noch ein oder zwei Tage Pause zu machen. Ich habe nach Tutorials auf YouTube gesucht - "ungefähr 49.300 Ergebnisse" (!!!) und von den über 30, die ich mir angeschaut habe, die sich alle mit einfachen Strukturen beschäftigen und "Movies" als Beispiel verwenden.

Nochmals vielen Dank, dass Sie so weit gelesen haben! Ich schätze jede Hilfe oder Hinweise.

Antwort

0

Ich denke, Sie sind durch die console.log() Ausgabe verwirrt, es ist nur eine kurze Darstellung, es zeigt nicht immer die Gesamtheit des Objekts (zum Beispiel [Object] bedeutet, dass es ein inneres komplexes Objekt ist). results ist ein Objekt, kein JSON-String, machen Sie einen console.log(typeof results); und es wird object ausgeben.

Sie können console.log(JSON.stringify(results, null, 3)); verwenden, um das gesamte Objekt anzuzeigen, es wird Ihnen helfen, das Objekt zu durchlaufen, indem Sie genau sehen, wo die Eigenschaften sind, die Sie benötigen (es ist nur für Debug-Zwecke). Als nächstes müssen Sie nichts mehr analysieren oder splitten/splitten, da result ein gültiges JS-Objekt ist. Durch das Stringifizieren wird es nur viel schwieriger. Versuchen Sie beispielsweise console.log(results[0].n[0].properties.lastName);, es sollte MacDonald angezeigt werden.

+0

Ich habe es versucht und bekam den folgenden Fehler: console.log (result [0]. N [0] .properties.lastName); ^ Typeerror: \ Entwicklung \ ps_jwt \ api \ routes.js: Kann nicht Eigentum 'n' undefinierter bei D lesen 205: 34 auf D: \ Entwicklung \ ps_jwt \ api \ node_modules \ Neo4j \ lib-new \ GraphDatabase.js: 301: 18 Ich habe eine Antwort darauf geschrieben, wie ich schließlich den Stapel von Arrays und Objekten durchgearbeitet habe, obwohl es immer noch nicht die beste Lösung ist. Vielen Dank! –

+0

@BruceMacDonald Ich habe 's' im Ergebnis vergessen. Ich habe meine Antwort bearbeitet. – Shanoor

+0

Hinzufügen der s funktionierte. Ich stimme zu, dass die Antwort, die ich mir ausgedacht habe, verworren ist. Ich brauche fast alle Eigenschaften der 3 Knoten und 2 Beziehungen, die die Ergebnisse zurückgegeben haben. Danke für die Vereinfachung! –

0

Nach einer erholsamen Nacht dachte ich, ich würde einen weiteren Riss in diesem nehmen. Ich ging schrittweise durch das Array von Objekten von Arrays von Objekten etc ... und hier ist, womit ich endete - Hier ist meine neue sonst Bedingung ...

EDIT: Ich habe vergessen zu erwähnen, dass ich am Ende mit der Bibliothek 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); 
} 

Wenn jemand eine elegantere Art hat, durch meine Gruppe verschachtelter Objekte zu arbeiten, lassen Sie es mich wissen. Dies ist ein bisschen rohe Gewalt und ist sehr spröde (meine Cypher-Abfrage muss die Parameter verwenden, so dass ich verschiedene Benutzer usw. übergeben kann).

Wo ich im Entwicklungszyklus bin, bringt es mich vorwärts.

Prost!

+0

Das ist ein komplizierter Weg für ein sehr einfaches Problem, * Ergebnisse * ist ein Objekt, benutze es. Welche Eigenschaften suchen Sie genau? – Shanoor

2

Ich habe eine Bibliothek speziell für diesen Zweck geschrieben:

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

Es analysiert Neo4j die Ausgabe und extrahiert nur das, was in der Abfrage zurückgegeben worden ist, sehen, ob es hilft!

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.