2017-08-26 3 views
0

J'ai une requête Cypher suivante:héritage de l'entité Neo4j SDN4 et indices

PROFILE MATCH (childD:Decision) 
WITH childD 
ORDER BY childD.createDate 
DESC SKIP 0 LIMIT 10 
MATCH (childD:Decision)-[ru:CREATED_BY]->(u:User) 
OPTIONAL MATCH (childD:Decision)-[rup:UPDATED_BY]->(up:User) 
RETURN ru, u, rup, up, childD AS decision, [ (childD)-[rdt:BELONGS_TO]->(t:Tag) | t ] AS tags 

En ce moment sur ma base de données Neo4j (~ nœuds 23k de décision) cette requête fonctionne ~ 50 ms et je ne comprends pas ou utilise index sur le champ childD.createDate.

C'est PROFILE sortie:

enter image description here

Ceci est mon 4 entités: NRS

@NodeEntity 
public abstract class BaseEntity implements BaseEntityVisitable { 

    private static final String CREATED_BY = "CREATED_BY"; 
    private static final String UPDATED_BY = "UPDATED_BY"; 

    @GraphId 
    private Long graphId; 

    @Index(unique = false) 
    private Date createDate; 

    @Relationship(type = CREATED_BY, direction = Relationship.OUTGOING) 
    private User createUser; 

    @Index(unique = false) 
    private Date updateDate; 

    @Relationship(type = UPDATED_BY, direction = Relationship.OUTGOING) 
    private User updateUser; 

.... 

} 

@NodeEntity 
public class Decision extends BaseEntity { 

    private static final String BELONGS_TO = "BELONGS_TO"; 
    private static final String CONTAINS = "CONTAINS"; 
    private static final String DEFINED_BY = "DEFINED_BY"; 

    @Index(unique = true) 
    private Long id; 

    @Index(unique = false) 
    private String name; 

.... 

} 

C'est :schema sortie:

Indexes 
    ON :BaseEntity(createDate) ONLINE 
    ON :BaseEntity(updateDate) ONLINE 

    ON :Decision(lowerName) ONLINE 
    ON :Decision(name) ONLINE 
    ON :Decision(totalChildDecisions) ONLINE 
    ON :Decision(totalViews) ONLINE 

    ON :Decision(id) ONLINE (for uniqueness constraint) 

S'il vous plaît noter que createDate l'indice est situé sur :BaseEntity et non sur :Decision

chaud pour vérifier que cela fonctionne d'index (ou non) pour cette partie de la requête: ORDER BY childD.createDate

Répondre

1

Je pense que vous confondez un indice avec un tri commande. Il n'y a aucune raison que cette requête utilise un index car vous ne lui donnez aucune valeur pour rechercher l'index. Il se peut que l'implémentation de l'index ait les dates dans l'ordre, mais aucune règle n'indique que cela doit être le cas (et, de toute évidence, la requête n'utilise pas d'index pour trier les nœuds Decision).

Espérons que cela aide.

Cordialement, Tom

+0

Merci pour votre réponse. Une question de plus sur l'héritage SDN 4 et les index Neo4j - par exemple la requête suivante 'MATCH (childD: Décision {name: 'Andres}} RETURN childD' Utilise-t-elle l'index pour' name 'déclaré au SDN 4' BaseEntity' et non à 'Decision' (où' Decision étend BaseEntity') directement? – alexanoid

+0

Si votre schéma a cet index spécifique pour cette étiquette spécifique (comme il semble d'après ce que vous avez posté), le MATCH utilisera l'index. Je ne suis pas informé sur SDN4 (donc je ne sais pas exactement comment vous avez créé le schéma) ... mais ce qui est dans le schéma remplace tout ce qui est dans votre code. –

+0

pour être 100% clair - si mon noeud 'Decision' a deux étiquettes -': BaseEntity' et ': Decision', donc dans ce cas si j'ai l'index': BaseEntity (createDate) 'et j'utilise' MATCH (d: Decision) WHERE d.createDate = {createDate} 'donc cet index sera utilisé? – alexanoid