2016-08-04 20 views
0

Bei der Verwendung von Spring-Data-Neo4j-4 scheint alles, was für die CRUD-Operationen der Standard-REST-API zurückgegeben wird, an die interne ID gebunden zu sein, die Neo4j den verschiedenen Knoten- und Beziehungstypen zuweist.Ändern des Standard-ID-Feldes für Neo4j mit Spring Data

Das Problem ist, diese IDs haben keinen echten Wert für Kunden, die unseren Service nutzen, den wir auf Spring Data aufbauen. Wenn ich zum Beispiel einen Personenknoten löschen möchte, müsste ich zuerst eine Abfrage durchführen, um die interne Neo4j-ID abzurufen (vielleicht ist es 1234), dann könnte ich den DEL-Aufruf gegen die CRUD-API ausgeben.

DEL http://myserver/person/1234 

Aber in meiner Welt, erkennen wir eine Person in unseren Systemen auf einem Benutzer-ID oder einem GUID-Code basieren. Was kann getan werden, um Spring Data zu verwenden? Verwenden Sie unsere eigenen eindeutigen Bezeichner, damit ich den obigen Löschanruf machen kann, indem ich den Benutzernamen moryl als ID verwende? Das würde CRUD für Benutzer mit IDs ermöglichen, die anderen Systemen in unserem Netzwerk bekannt sind, und ohne einen zusätzlichen Aufruf zu tätigen, um unser ausgewähltes ID-Feld mit einer MATCH/RETURN-Abfrage in die Neo4j-ID zu übersetzen.

Gibt es einen einfachen Weg, oder muss ich grundsätzlich viele der CRUD-Funktionalität Methoden, die Spring Data Benutzer ist neu schreiben?

Danke.

Antwort

1

Wenn Sie auf der Sitzung Delete Fähigkeit der OGM aussehen, gibt es auch keine Möglichkeit, einen Knoten zu löschen, ohne sie vor der Hand zu Laden:

interface Delete { 
     <T> void delete(T object); 
     <T> void deleteAll(Class<T> type); 
     void purgeDatabase(); 
     void clear(); 
    } 

Sie jedoch Knoten ein @Query in Ihrem Repository zum Löschen verwenden können basierend auf einem gegebenen Argument zu Ihrem Rest api, zum Beispiel:

//src/main/java/school/repository/StudentRepository 
@Repository 
public interface StudentRepository extends GraphRepository<Student> { 

    @Query("MATCH (s:Student) WHERE s.name = {0} DELETE s") 
    void deleteStudentByName(String name); 

} 

-

//src/main/java/school/controller/StudentController 
@RequestMapping("/api/student/delete/{name}") 
    public void deleteStudent(String name) { 
     studentRepository.deleteStudentByName(name); 
    } 

Dies würde verhindern, dass die Student-Entity überhaupt geladen wird.

Das heißt, mit benutzerdefinierten ID-Strategien wird gedacht, dies ist jedoch nicht trivial.