2017-02-21 2 views
2

Ich erstelle eine REST-API, die eine Verbindung zu einer NEO4J-Instanz herstellt. Ich verwende die koa-neo4j-Bibliothek als Basis (https://github.com/assister-ai/koa-neo4j-starter-kit). Ich bin ein Anfänger bei all diesen Technologien, aber dank einiger Hilfe von diesem Forum habe ich die grundlegende Funktionalität funktioniert. Der folgende Code erlaubt mir beispielsweise, einen neuen Knoten mit der Bezeichnung "metric" zu erstellen und den Namen und dateAdded propertis zu setzen.Übergabe von Eigenschaften und Knoten als POST-Anweisung mit KOA-NEO4J oder BOLT

URL:

/metric?metricName=Test&dateAdded=2/21/2017 

index.js

app.defineAPI({ 
    method: 'POST', 
    route: '/api/v1/imm/metric', 
    cypherQueryFile: './src/api/v1/imm/metric/createMetric.cyp' 
}); 

createMetric.cyp“

CREATE (n:metric { 
    name: $metricName, 
    dateAdded: $dateAdded 
}) 
return ID(n) as id 

Ich bin aber Struggl Ich möchte wissen, wie ich kompliziertere Beispiele angehen kann. Wie kann ich mit Situationen umgehen, wenn ich nicht weiß, wie viele Eigenschaften hinzugefügt werden, wenn ich vorher einen neuen Knoten erstelle oder wenn ich mehrere Knoten in einer einzigen Post-Anweisung erstellen möchte. Idealerweise würde ich gerne etwas wie JSON als Teil des POST übergeben, das alle Knoten, Beschriftungen und Eigenschaften enthalten würde, die ich erstellen möchte. Ist so etwas möglich? Ich versuchte, die folgende Cypher-Abfrage zu verwenden und eine JSON-Zeichenfolge in dem POST-Textkörper zu übergeben, aber es funktionierte nicht.

UNWIND $props AS properties 
CREATE (n:metric) 
SET n = properties 
RETURN n 

Würde ich besser Schalt TO THE Neo4j REST-API anstelle des BOLT-Protokoll und dem KOA-Neo4j Rahmen sein. Aus meiner Forschung heraus dachte ich, es wäre besser, BOLT zu verwenden, aber ich möchte eine Rest-API als die mittlere Schicht zwischen meinem Vorder- und Hinterende haben, so dass ich bereit bin, umzuschalten, wenn dies auf längere Sicht einfacher sein wird.

Danke für die Hilfe!

Antwort

3

Ihre Cypher-Syntax ist in mehrfacher Hinsicht schlecht.

  1. UNWIND akzeptiert nur eine Auflistung als Argument, keine Zeichenfolge.
  2. SET n = properties ist nur zulässig, wenn properties eine Karte ist, keine Zeichenfolge.

Diese Abfrage funktionieren sollte einen einzelnen Knoten für die Erstellung von (unter der Annahme, dass $props eine Karte ist mit allen Eigenschaften, die Sie mit dem neu erstellten Knoten gespeichert werden soll):

CREATE (n:metric $props) 
RETURN n 

Wenn Sie erstellen möchten mehrere Knoten, dann ist diese Abfrage (im wesentlichen das gleiche wie Sie) funktionieren sollte (aber nur, wenn $prop_collection ist eine Sammlung von Karten):

UNWIND $prop_collection AS props 
CREATE (n:metric) 
SET n = props 
RETURN n 
+0

Vielen Dank für Ihre Eingabe. Ich habe Ihren Code ausprobiert und die folgenden "Requisiten = [{Metrikname:" Testname ", dateCreated:" 21.02.2017 "}]" übergeben, aber ich erhalte den Fehler "Parameter für die Knotenerstellung ist keine Karte". Klar, ich strukturiere die "Karte" nicht richtig - irgendwelche Hinweise darauf? – n4nite

+1

@ n4nite Ihr Requisitenparameter muss eine Map sein, und der Wert, den Sie in Ihrer Abfrage verwenden möchten, sollte ein Eintrag in der Map sein, deren Wert eine Sammlung von Maps ist. Wenn wir das Beispiel von cybersam verwenden, müssten Ihre Requisiten den '$ prop_collection' Parameter verwenden:' reps = {prop_collection: [{metricName: "Test Name", dateCreated: "21.02.2017"}] } ' – InverseFalcon

+0

Gibt es irgendwo, dass ich auf Karten in Neo4j lesen kann, wie ich es nicht zur Arbeit bringen kann und nicht viel finde, wenn ich Google suche? Ich benutze die Beispiele und übergebe die "Requisiten" Zeichenfolge als Teil meiner POST-Anweisung an die API, aber ich bekomme immer noch einen Fehler, dass "Parameter zur Knotenerstellung keine Karte ist". – n4nite

1

Auch ich habe Schwierigkeiten bei dem Versuch, komplexe Typen passieren als Argument an Neo4j, dies mit Typkonvertierungen zu tun hat zwischen js und cypher über bolt und es gibt nicht viel ein, außer für die Einreichung eine Ausgabe in dem offiziell neo4j JavaScript driver Repo tun könnte . koa-neo4j verwendet den offiziellen Treiber unter der Haube.

Eine Möglichkeit, über solche Szenarien in koa-neo4j zu gehen JavaScript verwendet, die Argumente zu manipulieren, bevor zu Cypher Senden:

https://github.com/assister-ai/koa-neo4j#preprocess-lifecycle

auch möglich, weiter die Ergebnisse einer Cypher Abfrage zu manipulieren mit nachbearbeiten Lifecycle Haken:

https://github.com/assister-ai/koa-neo4j#postprocess-lifecycle

+0

Hallo Keyvan. Danke für Ihre Kommentare und das großartige Koa-Neo4j-Framework. Ich bin neu bei Node, Koa und Neo4j, also war das Framework ein fantastischer Weg, um loszulegen. Sobald ich in meinen Codierfähigkeiten mehr fähig bin, hoffe ich, zum Rahmen beizutragen! – n4nite

+0

Cheers @ n4nite, ich wäre mehr als glücklich, mit irgendwelchen Framework-bezogenen Problemen zu helfen, die auftreten könnten, nur [ein GitHub-Problem] (https://github.com/assister-ai/koa-neo4j/issues) wenn du bist auf einen gestoßen. Ich freue mich, dass du mit 'koa-neo4j' coole Sachen machst. – Keyvan

Verwandte Themen