2017-06-19 4 views
0

cherchant à comprendre si quelque chose peut être fait pour rendre la requête ci-dessous performant sur un grand graphique. J'essaie de trouver le chemin le plus court entre deux nœuds mais exclure les chemins qui incluent certains autres types de nœuds. Le problème semble être la clause WHERE. La requête ci-dessous s'arrête complètement.neo4j chemin le plus court avec contrainte d'étiquette

MATCH p=shortestPath((p1:Party{suprRC:"21"})-[*..15]-(p2:Party{suprRC:"21"})) 
WITH p 
WHERE NONE(n in nodes(p) where labels(n) in [["Reporter"],["FirstName"],["LastName"]]) 
RETURN p limit 500; 
+0

Vous pouvez essayer WHERE directement sur le MATCH (laissez WITH p en d'autres termes). –

+0

Merci pour la suggestion Tom - Je crains que cela n'a pas aidé cependant. –

+0

Couple de questions ... 1) le nœud de départ et le nœud final sont-ils les mêmes? Le suprRC est-il une propriété unique pour une partie? Sinon, les nœuds du Parti sont-ils indexés sur suprRC (je sais que cela devrait être évident, j'exclus simplement les options ici)? Lorsque vous exécutez seulement le MATCH (avec le RETURN et LIMIT mais sans WITH et WHERE) ... est-ce performant? Pouvez-vous partager la sortie d'un EXPLAIN de cette requête? –

Répondre

0

La comparaison est fausse, labels(n) retourne une collection d'étiquettes et vous correspondront une collection contre une collection de simples éléments de chaîne.

Comme mentionné par Tom, vous pouvez laisser tomber le AVEC mais vous devrez utiliser deux NONE prédicats

MATCH p=shortestPath((p1:Party{suprRC:"21"})-[*..15]-(p2:Party{suprRC:"21"})) 
WHERE NONE(x IN nodes(p) 
      WHERE NONE(l IN ['Reporter','LastName', 'FirstName'] 
         WHERE l IN labels(x) 
        ) 
     ) 
RETURN p limit 500; 
+0

Merci pour les suggestions Christophe. Je ne me souviens pas pourquoi j'ai utilisé l'idiome particulier que j'ai fait - bien que cela fonctionne (avec de plus petits graphiques/requêtes de toute façon). J'ai essayé celui que vous avez suggéré et cela a également fonctionné, mais il est encore trop lent (30 minutes pour que la requête se termine). Pouah. –