0

При использовании Spring-Data-Neo4j-4, кажется, что все, возвращаемое для CRUD-операций REST API по умолчанию, привязано к внутреннему идентификатору, который Neo4j назначает различным типам узлов и отношений.Изменение поля идентификатора по умолчанию для Neo4j с данными Spring

Проблема заключается в том, что эти идентификаторы не имеют реальной ценности для клиентов, использующих наш сервис, который мы строим поверх данных Spring. Например, если я хочу удалить узел Person, я должен сначала выполнить запрос, чтобы получить внутренний идентификатор Neo4j (возможно, это 1234), тогда я смог бы выдать вызов DEL против API CRUD.

DEL http://myserver/person/1234 

Но в моем мире мы признаем Личность в наших системах на основе идентификатора пользователя или кода GUID. Что можно сделать, чтобы Spring Data использовала наши собственные уникальные идентификаторы, чтобы я мог сделать вышеупомянутый вызов для удаления, используя вместо этого имя пользователя moryl? Это позволило бы мне делать CRUD для пользователей с идентификаторами, известными другим системам в нашей сети, и без необходимости делать дополнительный вызов для перевода нашего выбранного поля ID в Neo4j ID, выполняя запрос MATCH/RETURN.

Есть ли простой способ сделать это, или мне придется в основном переписать много методов функциональности CRUD, которые Spring Data является пользователем?

Спасибо.

ответ

1

Если вы посмотрите на Delete возможностях сессии ОГМ, там также нет возможности удалить узел без его загрузки, прежде чем руки:

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

Однако вы можете использовать в своем хранилище в @Query для удаления узлов на основе данного аргумента вашего отдыха API, например:

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

Это позволит вообще не загружать объект Student.

Сказанное говорит о том, что использование пользовательских стратегий id считается, но это не тривиально.