2017-10-11 5 views
0

J'ai une requête qui fonctionne avec succès:Neo4j requête - Trouver tous les nœuds qui satisfont à une condition de propriété et avoir des relations

match (n:A {tag_no:"N2203"})<-[:rel_a]-(v:B)-[:rel_b]->(r)<-[:rel_c]-(n) WHERE (v.invoice_date>="2012-08-01" AND v.invoice_date<"2016-02-01") with v, collect(r) as rs where all (x in rs where x.date<"2016-08-01") return count(v) as count;

Je dois filtrer davantage cette requête.

J'ai besoin de connexes r nodes with max(r.date) for each v, et savoir combien de ces noeuds ont une relation avec un autre noeud de type D

J'essaie cette requête, il renvoie une erreur de syntaxe

match (n:A {tag_no:"N2203"})<-[:rel_a]-(v:B)-[:rel_b]->(r)<-[:rel_c]-(n) WHERE (v.invoice_date>="2012-08-01" AND v.invoice_date<"2016-02-01") with v, max(r.date) as date collect(r) as rs where (all (x in rs where x.date<"2016-08-01") AND filter(x in rs where x.date=date)[0]<-[:rel_c]-(d:D)) return count(v) as count;

J'ai également essayé beaucoup d'autres combinaisons, mais toutes jettent une erreur de syntaxe. Toute aide est appréciée.

+1

Vos requêtes bénéficieraient de mise en forme, ce qui rendrait plus facile debuggind. Veuillez utiliser 4 espaces d'indentation (au lieu de triples accolades) et utiliser également plus d'espaces dans la requête. J'ai créé et donné un exemple à https://gist.github.com/szarnyasg/8b53983b5ade8a31e4410f8f48ee3653 –

Répondre

1

Le problème principal est que l'analyseur de requêtes ne peut pas maintenant si filter(x in rs where x.date=date)[0] est vraiment un nœud, ce qui n'est pas autorisé dans la syntaxe. Heureusement, il est possible de contourner ce au prix de quelques-uns verbosité:

  • Utilisez une autre clause WITH pour introduire un alias (n) à la variable de nœud. Cela vous permettra d'utiliser la syntaxe WHERE <pattern>.
  • En outre, vous ne pouvez pas introduire de nouvelles variables dans la clause WHERE, utilisez simplement (:D) au lieu de (d:D).

Ainsi, la requête ressemblera à ceci (évidemment, je ne l'ai pas testé):

MATCH (n:A {tag_no:"N2203"})<-[:rel_a]-(v:B)-[:rel_b]->(r)<-[:rel_c]-(n) 
WHERE v.invoice_date>="2012-08-01" 
    AND v.invoice_date<"2016-02-01" 
WITH 
    v, 
    max(r.date) AS date, 
    collect(r) AS rs 
WHERE all(x IN rs WHERE x.date<"2016-08-01") 
WITH filter(x in rs where x.date=date)[0] AS n, v 
WHERE (n)<-[:rel_c]-(:D) 
RETURN count(v) AS count;