2015-05-12 15 views
5

Ich muss ein Array von User-Objekten in einem Tile-Knoten speichern. Jedes Benutzerobjekt enthält drei primitive Eigenschaften. Id (eine einzelne Alpha-Zeichenkette), fName und lName. Diese Objektliste ist eine Eigenschaft des Tile-Knotens mit mehreren anderen primitiven Eigenschaften. Der gesamte Tile-Knoten muss nach Json serialisiert werden, einschließlich der verschachtelten User-Objekte.Objekt als Eigenschaft in Neo4j speichern

Ich verstehe, dass Neo komplexe Objekte nicht als Eigenschaften speichern kann. Ich habe den Benutzer als einen separaten Knoten mit ID, FName und LName als Eigenschaften erstellt, und ich kann diese über Cypher erhalten. Ich kann auch Json-Ausgabeergebnisse für den übergeordneten Tile-Knoten erhalten. (In diesem Fall ist Benutzer nur eine Zeichenfolge von durch Kommas getrennten Alphas). Aber wie bekomme ich die Ausgabe des Benutzerknotens im übergeordneten Knoten verschachtelt?

Ich habe eine Liste von Benutzerobjekten (userList) erstellt, indem ich Benutzerobjekte über eine Cypher-Abfrage mit der Zeichenfolge von Benutzer-IDs im Kachelknoten in Beziehung gesetzt habe. Ich muss nur von zwei separaten Json-Ausgaben zu einem einzelnen verschachtelten Ausgang kommen.

Ich hoffe, das ist genug Detail. Ich benutze Neo4j 2.1.6 und Neo4jClient. Ich benutze auch .Net 4.0.

Antwort

4

Sie könnten so etwas mit cypher tun und die Chiffre ein zusammengesetztes Objekt zurückgeben lassen.

match (t:Tile)-[:CONTAINS_USER]-(u:User) 
where t.name =~ 'Tile.*' 
with {name: t.name, users: collect(u) } as tile 
return collect(tile) as tiles 
+2

Oooh, das ist Betrug. Ich mag das. :) – FrobberOfBits

+0

Was füge ich hinzu, um die Ergebnisse der Sammlung anzuzeigen? –

+0

gibt es zwei Sammlungen: 1) Der erste Teil der Abfrage stimmt nur mit den Kacheln überein und erstellt eine Sammlung von verknüpften Benutzern. Dies wird als eine zusammengesetzte "Kachel" -Karte zurückgegeben, die einige Kacheldaten und die Auswahl von Benutzern für diese Kachel enthält. 2) nimmt einfach alle neuen Kachelkarten und gibt sie als Sammlung zurück. –

3

Sie sollten kein anderes Objekt als verschachtelte Eigenschaft speichern. Wie du richtig sagst, unterstützt neo4j das nicht, aber selbst wenn es so wäre, solltest du es nicht tun, weil du die beiden mit einer Beziehung verknüpfen solltest. Das ist die Hauptstärke einer Graphdatenbank wie neo4j, also solltest du diese Stärke ausspielen und die Beziehungen nutzen.

Der Server verfügt über ein Standard-JSON-Format, das dazu neigt, Knoten als eigene JSON-Objekte auszugeben. Das bedeutet, dass Sie praktisch, da Sie dies als zwei separate Knoten mit einer Beziehung modellieren möchten, den Server standardmäßig nicht dazu bringen können, den JSON für ein Objekt unter dem anderen zu verschachteln. Es wird den JSON nicht so verschachteln, weil die Daten nicht gespeichert werden.

In diesem Fall würde ich die REST-Dienste verwenden, um den JSON für jedes Objekt einzeln abzurufen, und dann die Verschachtelung selbst in Ihrem Code vornehmen - nur mit Ihrem Code wissen Sie, welche Eigenschaft er sollte verschachtelt werden und wie das gemacht werden sollte.

+0

Ich stimme zu, dass Sie überlegen sollten, ob Sie ein Objekt als geschachtelte Eigenschaft speichern möchten, aber es ist falsch zu sagen, dass Sie dies nicht tun können. Ich denke, es ist zu weit gefasst, dass Sie keine Objekte als verschachtelt speichern sollten Eigenschaften. Ein Beispiel ist so etwas wie ein Datum, wir können eine 'DateTime' verwenden, aber Sie könnten das auch in 3 verbundene Knoten von Tag, Monat und Jahr aufteilen, die geeignet sein könnten oder einen massiven Overkill. –

+0

Was ich getan habe, ist die Serialisierung dieser Liste von Benutzerobjekten und das Einfügen dieser Zeichenfolge als Zeichenfolge in die Benutzereigenschaft des Tile-Knotens. Wenn Sie einen Tile-Knoten anfordern, wird ein gültiger geschachtelter JSON ausgegeben, also bin ich auf dem richtigen Weg, denke ich. Ich habe einen anderen Fehler, daher ist es schwer zu sagen, ob das funktioniert oder nicht. Ist das als Strategie akzeptabel? Beide Antworten waren exzellent, stärker zusammen - nette Teamarbeit! –

+0

@ChrisSkardon Punkt genommen; Natürlich gibt es bei jeder Technologie sehr wenig, was Sie grundsätzlich nicht tun können. Und ich nehme an, was Sie mit DateTime meinen, aber das ist ein Sonderfall, der normalerweise als ein eingebauter primitiver Typ und nicht als ein komplexer benutzerdefinierter Typ betrachtet wird. Ich dachte an komplexe Domäne/benutzerdefinierte Typen wie "Bank Account". *Könntest du es machen? Nun ja ... sicher, aber es ist schwer, sich * übliche * Szenarien vorzustellen, wo das die bessere Entscheidung wäre. (Natürlich können Sie auch ungewöhnliche Nischen finden, wo es vielleicht vorzuziehen ist) – FrobberOfBits

2

Zusätzlich zu diesen Antworten ist zu beachten, dass, wenn Sie (zB die Suche nach Fliesen, wo ein User.name ist „X“), können Sie einfach nicht die Teilfeld Eigenschaften in jeder Ihrer Anfragen beinhalten müssen Serialisierung die Objekte Felder zu einer Zeichenfolge vor dem Einfügen (z. B. mit JSON.stringify), und unserialisieren sie beim Lesen aus der DB.

Dies ist besonders nützlich, wenn Sie strukturierte Daten an einen Knoten "anhängen" möchten, aber dass Sie diese Daten in Bezug auf die Beziehungen in Ihrer DB nicht interessieren (z. B. Benutzereinstellungen).

Verwandte Themen