使用Spring Data更改Neo4j的默认ID字段

时间:2016-08-04 19:16:16

标签: neo4j spring-data spring-data-neo4j spring-data-neo4j-4

使用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功能方法?

感谢。

1 个答案:

答案 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策略,但这并非易事。