使用Spring-Data-Neo4j-4时,似乎为默认REST API的CRUD操作返回的所有内容都与Neo4j分配给各种节点和关系类型的内部ID相关联。
问题是,这些ID对使用我们在Spring Data之上构建的服务的客户没有实际价值。例如,如果我想删除Person节点,我必须首先进行查询以检索内部Neo4j ID(可能是它的1234),然后我就可以发出DEL调用CRUD API。
DEL http://myserver/person/1234
但在我的世界中,我们根据用户ID或GUID代码识别系统中的Person。有什么办法可以让Spring Data使用我们自己的唯一标识符,以便我可以使用用户名moryl
作为ID来进行上述删除调用?这样我就可以对我们网络中其他系统已知ID的用户进行CRUD,而无需通过执行MATCH / RETURN查询进行额外调用将我们选择的ID字段转换为Neo4j ID。
有没有简单的方法,或者我是否必须基本上重写Spring Data用户的许多CRUD功能方法?
感谢。
答案 0 :(得分:1)
如果您查看OGM会话的Delete
功能,也不可能在未加载节点的情况下删除节点:
interface Delete {
<T> void delete(T object);
<T> void deleteAll(Class<T> type);
void purgeDatabase();
void clear();
}
但是,您可以在存储库中使用@Query
根据rest 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策略,但这并非易事。