2016-11-06 6 views
-3

Ich plane, Neo4j für mein aktuelles Projekt (eine REST API) zu verwenden. Ich habe gelesen, dass es nicht ratsam ist, die ID von Neo4j zu verwenden, da die ID bei einem Neustart für Optimierungen wiederverwendet werden kann. Allerdings sind diese Threads ein paar Jahre zurück bis 2012. Auf der offiziellen GitHub-Seite von Neo4j scheint es, dass sie versprochen haben, dieses Problem für Neo4j 2.x (zurück im Jahr 2013) zu lösen. Es ist jetzt 2016 und Neo4j ist auf 3.0.Wird die interne ID von Neo4j immer noch nicht empfohlen?

Also meine Frage ist: Hat sich etwas geändert? Ist es immer noch unsicher, die ID in der API offen zu legen? Oder stecken wir immer noch auf UUIDs, um die Eindeutigkeit zu garantieren?

+0

Kann ich fragen, warum es abgelehnt wird? – Synch

Antwort

3

Interne Neo4j-IDs sollten nicht für Referenzknoten oder Beziehungen in einem externen System verwendet werden. Diese IDs sind im Wesentlichen Offsets, die auf eine Stelle im Dateispeicher verweisen, um auf einen Knoten oder eine Beziehung zu verweisen.

Wie Sie darauf hingewiesen haben, kann beim Löschen von Daten dieser leere Speicherplatz im Dateispeicher zurückgewonnen werden, was bedeutet, dass interne IDs zurückgewonnen werden können.

Wenn Sie sich auf einen Knoten/eine Beziehung in einem externen System beziehen, besteht ein gängiger Ansatz darin, eine UUID zu generieren und als Eigenschaft auf dem Knoten zu speichern (mithilfe eines Indexes kann der Knoten effizient nachgeschlagen werden).

In Neo4j 3.x gibt es eine user defined function in the APOC library zum Generieren von UUIDs von Cypher. Zum Beispiel:

CREATE (p:Person) 
SET p.name = "Will", 
    p.uuid = apoc.create.uuid() 
0

haben auch einen Blick auf https://github.com/graphaware/neo4j-uuid die die UUID für Sie erzeugen und sicherzustellen, dass niemand kann sie ändern oder löschen, ohne die Notwendigkeit, Ihre Anfragen zu ändern.

+0

Ich habe versucht, neo4j-Uuid zuvor mit einem Spring Data Neo4j und Repository-Schnittstellen-Setup zu verwenden. Ich stieß auf das Problem, dass die UUID bei der Erstellung einer Entität null war (höchstwahrscheinlich aufgrund von ORM-Caching), also musste ich sie fallen lassen. – Synch

Verwandte Themen