2016-11-30 1 views
3

faire respecter, je suis en cours d'exécution dans un problème où j'application l'utilisation d'un index dans une requête par lot Cypher,question Neo4j avec index

UNWIND {rows} AS row 
MATCH (s:Entity) 
USING INDEX s:Entity(uuid) 
WHERE s.uuid = row.source 
MATCH (t:Entity) 
USING INDEX t:Entity(uuid) 
WHERE t.uuid = row.target 
MATCH (s)-[r:CONSUMED]->(t) 
DELETE r 

row.source et row.target et les deux chaînes UUID. Le problème est que j'obtiens l'erreur, ERROR - Cannot use index hint in this context.

Si j'augment la requête pour renvoyer uniquement la relation d'une source spécifique et le noeud cible dans l'interface utilisateur Neo4j, à savoir

MATCH (s:Entity) 
USING INDEX s:Entity(uuid) 
WHERE s.uuid = '04bc79e1-a836-11e6-b841-22000bcec6a9' 
MATCH (t:Entity) 
USING INDEX t:Entity(uuid) 
WHERE t.uuid = 'a245f46a-a837-11e6-b841-22000bcec6a9' 
MATCH (s)-[r:CONSUMED]->(t) 
RETURN r 

aucune erreur est levée et la relation est retournée, et donc je suis un peu perplexe ce que le problème pourrait être?

+0

sur quelle version êtes-vous? Cela devrait être corrigé dans les versions plus récentes –

+0

Je l'ai essayé sur le navigateur 3.1.0-M13-beta3, et j'ai toujours l'erreur. – cybersam

+0

@MichaelHunger Voir ma réponse mise à jour. Ce comportement dans les versions récentes de neo4j semble être un bug avec le code qui vérifie si 'USING INDEX' est autorisé. – cybersam

Répondre

5

[MISE À JOUR]

Votre deuxième requête a également modifié les clauses WHERE, ce qui est la raison pour laquelle il a travaillé.

Neo4j ne prend pas en charge utilisant la clause USING INDEX pour un index qui sera utilisé pour comparer les valeurs de propriété à l'autre (comme vous le faites dans votre première requête). Remarque: les dernières versions de neo4j sont en fait en mesure d'utiliser l'index dans ce scénario, mais si vous essayez de spécifier la clause USING INDEX comme argument, neo4j se plaindra. C'est probablement un bug. J'ai soumis Issue 8463 pour cela. Toutefois, neo4j n'a aucun problème avec la clause USING INDEX lorsque l'index est utilisé pour comparer une valeur de propriété à un identificateur ou à un littéral (comme dans votre deuxième requête).

Heureusement, il existe une solution de contournement simple. Vous pouvez simplement créer des identifiants pour les valeurs de propriété et utiliser ces identifiants à la place. Par exemple, voyez comment la clause WITH est utilisée ici:

UNWIND {rows} AS row 
WITH row.source AS source, row.target AS target 
MATCH (s:Entity) 
USING INDEX s:Entity(uuid) 
WHERE s.uuid = source 
MATCH (t:Entity) 
USING INDEX t:Entity(uuid) 
WHERE t.uuid = target 
MATCH (s)-[r:CONSUMED]->(t) 
DELETE r 
+0

Je n'étais pas au courant de cela. Cela s'applique-t-il à tous les cas de recherche d'index, y compris lors de MATCH avec une propriété row à partir d'une importation CSV? La plupart des exemples que je vois pour cela utilisent directement la propriété row au lieu d'aliaser, donc cela voudrait dire que les index ne sont jamais utilisés? Y compris pour les fusions? – InverseFalcon

+1

Je ne m'attendrais pas à ce que de telles requêtes puissent utiliser des index. – cybersam

+0

J'ai mis à jour ma réponse avec une image plus complète du problème. Donc, je comprends maintenant que mon dernier commentaire n'est généralement pas vrai. Avec les versions récentes de neo4j, de telles requêtes peuvent utiliser des index dans ce scénario, mais seulement si le planificateur choisit d'utiliser des index. Vous ne pouvez pas utiliser la clause 'USING INDEX' pour donner un indice. – cybersam