2017-03-29 1 views
0

Quelqu'un peut-il expliquer la différence entre @GraphId et @Index annotation de org.neo4j.ogm.annotation? Pour l'instant, après avoir lu les documents, il semble que @GraphId est utilisé pour créer un identifiant pour la logique interne de Neo4j et les utilisateurs ne devraient pas s'en remettre, car il peut être réutilisé au fil du temps. Mais qu'en est-il de @Index?Spring Data Neo4j @GraphId et @Index

Si je comprends bien, le principal avantage des bases de données à base de graphique est qu'une fois que nous connaissons le nœud/rapport à partir duquel commencer les choses deviennent faciles, car tout ce que nous devons faire est de traversent tout le graphique de ce départ nœud. Et l'indexation aide à le faire, non? Ainsi, nous pouvons écrire quelque chose comme START n = node:index_name(property_name = value) et commencer immédiatement à exlorer le graphique du noeud indexé par la propriété 'property_name', n'est-ce pas?

Donc, considérez cette entité:

@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; 
} 

Comme vous pouvez le voir la propriété String name est annotées avec @Index. Comment puis-je écrire une requête Cypher pour commencer réellement à partir du nœud avec le nom = 'quelque chose'? Quel est le nom de l'index? Ou Spring Data Neo4j 4.2.0.RELEASE le figure-t-il lui-même lors de l'écriture juste MATCH (event:Event {name = 'somehting'} ...?

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

    Event findOne(String eventName); 

} 

Ici, la classe repositry et comme vous pouvez le voir, je suis en utilisant String comme le type de l'identifiant de l'entité du référentiel gère, donc je suppose que Spring utilise la propriété name de classe d'événements pour générer une requête pour Event findOne(String eventName);

Répondre

3

@Index est similaire à @Indexed si vous êtes familier avec spring-data-mongodb ou @Index dans spring-data-jpa. Fondamentalement, il indexe le champ (entre autres choses), ce qui le rend très rapide.
En ce qui concerne votre méthode de dépôt, il devrait être nommé comme celui-ci

Event findByName(String eventName); 
+0

Oui, en effet. Regarde ça. Cela pourrait aider http://graphaware.com/neo4j/2015/01/16/neo4j-graph-model-design-labels-versus-indexed-properties.html – pvpkiran

0

Quelqu'un peut-il exmplain la différence et @GraphId annotation Situés entre @Index de org.neo4j.ogm.annotation? Je suppose que vous avez vérifié le document de Spring Data Neo4j. Mais une chose que je veux ajouter à propos de @GraphId et @Index est que @GraphId est unique parmi la totalité de la base de données tandis que @Index peut être identique ou unique, selon votre décision. Comment puis-je écrire la requête Cypher pour démarrer réellement à partir du noeud avec le nom = 'quelque chose'? Quel est le nom de l'index? Ou ne figure printemps données Neo4j 4.2.0.RELEASE elle-même quand écrire juste MATCH (événement: événement {name = « de somehting »} ...

Je crois que vous écrivez la requête Cypher de manière correcte. Les index (y compris les identifiants de graphe) sont conservés par la base de données et mis à jour, sous forme de certaines structures de données, par exemple B-Tree ou Map, ce qui permet de réduire le temps de recherche. sortir votre neo4j db pour les index.Ils sont soit stockés dans des fichiers gérés par le db (Where does Neo4j store the data?).Quant à savoir comment Cypher connaît le nom d'un index, puisque les index sont gérés par les requêtes db et Cypher sont également décodés par la base de données, il serait logique que la base de données puisse accéder à l'index selon la requête Cypher. C'est juste ma deviner basé sur ma compréhension du système DB.