如何将 neo4j Id 更改为 UUID 并使查找器方法起作用?

How can I change neo4j Id to UUID and get finder methods to work?

Neo4j 需要一个 Long 类型的 id 字段才能工作。这适用于 Spring data neo4j。我想要另一个 UUID 类型的字段,并让 T findOne(T id) 与我的 UUID 一起工作,而不是新生成的 ID。

因为我正在使用 Spring Data Rest,所以我不想在 URL 中暴露 neo 的 ID。

http://localhost:8080/resource/{neoId}

http://localhost:8080/resource/{uuid}

如果这可能的话有什么想法吗?

已更新

{
    name: "Root",
    resourceId: "00671e1a-4053-4a68-9c59-f870915e3257",
    _links: {
    self: {
        href: "http://localhost:8080/resource/9750"
    },
    parents: {
         href: "http://localhost:8080/resource/9750/parents"
    },
    children: {
        href: "http://localhost:8080/resource/9750/children"
              }
     }
 }

您可以向您的实体添加一个 String 属性,将其命名为 uuid,然后简单地声明一个 E findByUuid (String uuid) in your Repository for E, Spring Data 会自动为它生成代码。 例如:

@NodeEntity
public class Entity {
    ...
    @Indexed
    private String uuid;
    ...
    public String getUuid() {
        return uuid;
    }
    void setUuid(String uuid) {
        this.uuid = uuid;
    }
    ...
}

public interface EntityRepository extends GraphRepository<Entity> {
    ...
    Entity findByUuid(String uuid);
    ...
}

当涉及到存储库中的 finder 方法时,您可以自由地在自己的界面中覆盖 CrudRepository 中提供的方法,或者提供可能是 T findByUuid(Long uuid) 的替代方法。

根据您对 classes 建模的方式,您可以依赖方法名称的派生查询,或者您可以使用查询进行注释,例如:

@Query(value = "MATCH (n:YourNodeType{uuid:{0}) RETURN n")

如果您要使用特定的 UUID class,那么您需要告诉 Neo 如何保留 UUID 值。如果你将它存储为一个字符串(看起来很合理)那么我相信没有必要注释这个字段,那么你将需要一个 GraphProperty 注释:

@GraphProperty(propertyType = Long.class)

同样,根据 UUID 的 class,您可能需要使用 Spring 注册一个转换 class,它实现 org.springframework.core.convert.converter.Converter 接口并在您的域 class类型(UUID)和存储类型(String)。

或者,直接把UUID转成字符串自己存起来,不用担心所有的转换。

无论您做什么,请确保您的新 uuid 已编入索引并且可能是唯一的。