2016-08-31 7 views
1

Ich versuche eine Abfrage zu schreiben, um Daten aus meiner Neo4J-Datenbank zu ziehen. Sagen wir es fünf Bedingungen, die bestimmen, ob ich _____ aus meiner Datenbank ziehen wollen: A, B, C, D und E. Der boolean Ausdruck, der dies bestimmt ist:Neo4j Cypher Abfragesprache - Reihenfolge der Operationen für boolesche Ausdrücke

A && B && (C || D || E) 

aus dem Web-Scheuern Ich kann keine Informationen über eine Reihenfolge von Operationen finden, an die sich die AND- und OR-Anfragen von Neo4J halten (UND geht normalerweise OR voraus), aber aus meinen Beobachtungen scheinen sie sequentiell ausgeführt zu werden. Da es keine Möglichkeit gibt, die Reihenfolge explizit zu definieren, aka mit Klammern, wie würde man eine Cypher-Abfrage implementieren, um den obigen booleschen Ausdruck zu erfüllen?

Antwort

4

gibt es keine Möglichkeit, die ich kenne, um explizit zu definieren, auch bekannt als Klammer mit

nicht so sicher sein kann. ;)

Zunächst einmal gibt es immer eine Assoziation oder Gruppierung, auch wenn es implizit ist, falls sie sequentiell ausgeführt werden. Schauen wir uns einen Fall an, in dem das wichtig ist.

MATCH (n) RETURN CASE WHEN false AND true OR true THEN 'and' ELSE 'or' END 

(Das wird funktionieren, solange es mindestens einen Knoten in der Datenbank ist.)

Diese muss gleichwertig sein, entweder ((false and true) or true) oder (false and (true or true)), aber diese haben unterschiedliche Ergebnisse.

Die obige Abfrage gibt "und" im ersten Fall und "oder" im zweiten Fall zurück, um Ihnen anzuzeigen, was zuerst ausgeführt wurde. Es gibt "und" zurück, weil sie nacheinander gruppiert sind.

Dies gibt auch "und" zurück, da dies die implizierte Gruppierung ist, die Sie erhalten, wenn Sie die booleschen Operatoren sequenziell ausführen.

MATCH (n) RETURN CASE WHEN (false AND (true OR true)) THEN 'and' ELSE 'or' END 

Aber das gibt "oder" zurück.

Das war eine wirklich langatmige Art zu sagen, dass das Hinzufügen von Klammern in der Tat die Antwort ist.


Just for fun, habe ich versucht, den Vorrang zu bestimmen, und es scheint, dass Neo hat und-Vorrang:

MATCH (n) RETURN CASE WHEN true or true and false THEN 'and' ELSE 'or' END 

Wenn der oder die ersten Gebiete unterteilt:

(true or true) and false => true and false => false 

Wenn die und ist zuerst gruppiert:

true or (true and false) => true or false => true 

Die obige Abfrage gibt 'und' zurück und gibt an, dass das implizit gruppierte Konstrukt insgesamt als wahr ausgewertet wurde (und somit zuerst gruppiert wurde, obwohl es zuletzt sequenziell auftrat).