Spring Data Neo4j @GraphId和@Index

时间:2017-03-29 18:32:19

标签: java spring neo4j spring-data-neo4j

任何人都可以从@GraphId开始@Indexorg.neo4j.ogm.annotation注释之间的区别吗? 现在,在阅读文档后,似乎@GraphId用于为Neo4j内部逻辑创建标识符,用户不应该依赖它,因为它可以随着时间的推移重复使用。但是@Index呢?

据我所知,基于图形的数据库的主要优点是,一旦我们知道从哪个开始就变得容易的节点/关系,因为我们所需要做的只是从该起始节点遍历图形。索引有助于这样做,对吧?因此,我们可以编写类似START n = node:index_name(property_name = value)的内容,并通过'property_name'属性轻松地从索引节点开始探索图表,对吗?

所以,考虑一下这个实体:

@ToString
@NodeEntity(label = "Event")
@NoArgsConstructor
public class Event{

    public Event(String eventName, LocalDate dateTime){
        this.name = eventName;
        this.date = dateTime;
    }

    public Event(Long id, String eventName, LocalDate dateTime){
        this(eventName, dateTime);
        this.id = id;
    }

    @Getter
    @GraphId
    private Long id;

    @Getter
    @Index(unique = true, primary = true)
    @Property(name = "name")
    private String name;

    @Getter
    @Property(name = "date")
    @Convert(DateConverter.class)
    private LocalDate date;
}

正如您所见,String name属性已使用@Index进行注释。如何编写Cypher查询实际从name ='something'的节点开始?什么是索引名称?或者Spring Data Neo4j 4.2.0.RELEASE在写MATCH (event:Event {name = 'somehting'} ...时是否自己想出来?

@Repository
public interface EventRepository extends Neo4jRepository<Event, String>{

    Event findOne(String eventName);

}

这里是repositry类,你可能会看到我使用String作为存储库管理的实体的id的类型,所以我假设Spring使用Event类的name属性来生成查询Event findOne(String eventName);

2 个答案:

答案 0 :(得分:3)

如果你熟悉spring-data-mongodb或者spring-data-jpa中的@Index,那么@Index类似于@Indexed。基本上它会对字段(以及其他内容)进行索引,这使得它可以非常快速地搜索该字段   关于您的存储库方法,它应该像这样命名

Event findByName(String eventName);

答案 1 :(得分:0)

  

任何人都可以从org.neo4j.ogm.annotation中删除@GraphId和@Index注释之间的差异吗?

我假设您已经检查过Spring Data Neo4j的文档。但是我要添加的关于@GraphId和@Index的一件事是@GraphId在整个数据库中是唯一的,而@Index可以是相同的或唯一的,这取决于你的决定。

  

如何编写Cypher查询以实际从具有名称=&#39;某些节点的节点开始?什么是索引名称?或者Spring Data Neo4j 4.2.0.RELEASE在编写MATCH时会自己想象(事件:事件{name =&#39; somehting&#39;} ...?

我相信你以正确的方式编写Cypher查询。索引(包括图形ID)由数据库维护并保持最新。它们以某种数据结构的形式存储。例如,B-Tree或Map,可以减少搜索时间。你可以查看你的neo4j数据库的索引。它们或者存储在由db(Where does Neo4j store the data?)维护的文件中。

至于Cypher如何知道索引的名称,因为索引由db维护,而Cypher查询也由db解码,因此db可以根据Cypher查询访问索引。根据我对数据库系统的理解,这只是我的猜测。