2017-09-20 1 views
2

J'ai une requêteSimplifier requête Cypher qui converge à un noeud

MATCH (x:NodeA)-[]-(y:NodeB)-[]-(z:NodeC) 
RETURN DISTINCT z.property. 

Il existe de nombreux exemples de noeud x et noeud z, mais seulement quelques nœuds y, ce qui signifie que la plupart des chemins passent par le même nœud à y.
Existe-t-il un moyen de simplifier la requête et donc de réduire le nombre de chemins vérifiés par neo, étant donné que je me fiche de quel nœud x provient le nœud z final?
La requête a actuellement ~ 280 millions de chemins, mais il n'y a que ~ 50 nœuds à y.

Répondre

1

Puisque vous venez de trouver fichez en fait de NodeA, NodeB - NodeC paires où NodeB est connecté à un NodeA. Dans le cas contraire, vos résultats sont multipliés par le nombre de NodeA s (avant DISTINCT les filtres out):

MATCH (y:NodeB)-[]-(z:NodeC) 
WHERE (:NodeA)-[]-(y) 
RETURN DISTINCT z.property 
+0

Ceci ne sera pas compilé car vous ne pouvez pas introduire une nouvelle variable dans la clause WHERE: 'Variable 'x' non défini (ligne 2, colonne 8 (offset: 36))'. Cependant, l'utilisation de 'WHERE (: NodeA) - [] - (y)' fonctionnera correctement. J'ai suggéré une modification qui corrige cela. –

1

Alternativement Cypher de Tezra, vous pouvez utiliser une requête comme:

MATCH (z:NodeC) 
WHERE (:NodeA)-[]-(:NodeB)-[]-(z) 
RETURN z.property 

Le principal avantage ici est le fait que vous n'avez pas besoin d'utiliser le DISTINCT. Mais il est important que vous utilisiez PROFILE pour voir le plan d'exécution de chaque requête et choisissez celui qui convient le mieux à votre schéma.