Anleitung zum evaluativen booleschen Logikbaum benötigen

8

Ich kann keinen Anhaltspunkt in die richtige Richtung finden, ich bin nicht einmal sicher, was die Begriffe sind, die ich erforschen sollte, aber unzählige Stunden des Googelns scheinen mich im Kreis zu drehen, also hoffentlich der kollektive Bienenstock von Intelligenz von Stack Overflow kann helfen.

Das Problem ist, ich brauche eine Möglichkeit, Daten zu filtern, die ich nur als zusammengesetzten Logikbaum bezeichnen kann. Derzeit implementiert das System ein einfaches UND-Filtersystem. Nehmen wir zum Beispiel an, wir haben einen Datensatz von Menschen. Sie fügen eine Reihe von Filtern hinzu, so dass alle Personen angezeigt werden, wo (Geschlecht = weiblich) UND (Alter & gt; 23) UND (Alter & lt; 30) UND (Status = Einzel). Einfach genug, durchlaufen Sie jedes Element, fügen Sie nur dann einer Sammlung gültiger Elemente hinzu, wenn alle Bedingungen erfüllt sind.

Das Problem, auf das ich stoße, ist, wie ich mit dem Benutzer umgehen kann, der in der Lage ist, komplexe Abfragen zu erstellen, die involviert sind und oder und? Ich denke an etwas wie einen Baum, wo jeder Knoten repräsentiert und Ausdruck seiner Kinder wahr oder falsch auswertet. Ein einfaches Beispiel wäre - filter down zu ((Sex == männlich und Alter == 25) oder (Sex == weiblich und Status == Single)) und IQ & gt; 120. Tut mir leid, ich kann mir im Moment kein besseres Beispiel vorstellen. Aber wie würden Sie diese Art von Ausdrucksbaum darstellen und die Elemente in einer Sammlung anhand dieser Filter auswerten? Was sind einige Hinweise, die helfen würden? Hölle, was sind einige verdammte Google-Suche, die in eine positive Richtung führen könnten?!

Danke an alle, die Ihnen helfen können.

Hier ist ein Beispiel für eine zusammengesetzte Abfrage in Baumform mit einem Datensatz von Personen

  • Abfrage - Zeigen Sie mir alle Menschen, wo Sex männlich und Augen grün sind oder Geschlecht ist weiblich, Augen sind blau, oder Status ist Single. In Parenform (Sex == Male & amp; & amp; Eyes == Grün) || (Sex == Weiblich & amp; & amp;; (Augen == Blau || Status == Single))

Also in Baumform im Denken

%Vor%

Ich glaube, die Lösung besteht darin, jeden Knoten in einer Datenstruktur wie

darzustellen %Vor%

Bewerten Sie also für einen gegebenen Knoten die chilren, wenn Sie ein AND-Knoten sind, und geben Sie true zurück, wenn Ihr Ausdruck true ergibt und alle Ihre UND-Kinder als true ausgewertet werden oder ein ODER-Kind als true und recurse up ausgewertet wird.

Scheint, jede begriffliche Bedingung zu erfüllen, die ich darauf werfen kann, aber wir werden, seit ich es einmal umgesetzt habe. Ich werde den richtigen Code später veröffentlichen, wenn es funktioniert und Bilder helfen, dieses Problem besser für andere zu beschreiben.

    
JTtheGeek 02.12.2009, 05:58
quelle

5 Antworten

1

Dein Parsing des Ausdrucks ((Sex == männlich UND Alter == 25) ODER (Sex == weiblich und Status == Single)) UND IQ & gt; 120 sieht seltsam aus. Ich würde es als:

analysieren %Vor%

Der Baumtyp wäre:

%Vor%     
jon-hanson 04.12.2009, 12:40
quelle
1

Diese Art von Abfragen werden oft als OR ed-Array von AND ed-Klauseln dargestellt. Das heißt, ein Tabellenformat, in dem Sie über mehrere Bedingungen AND ed lesen und dann bis OR sie lesen. Dies führt zu einigen Wiederholungen von Bedingungen, ist aber für Benutzer leicht zu lesen, zu schreiben und zu verstehen. Ihr Beispiel ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120 würde wie

aussehen %Vor%     
Hyman Rosen 04.12.2009 17:55
quelle
1

Sie sollten Google nach Begriffen wie "Prädikatenkalkül" und "konjunktive Normalform" suchen.

    
High Performance Mark 05.12.2009 14:16
quelle
0

Ich muss sagen, dass dies der Grund ist, warum Datenbank-Engines gebaut werden. Sie können alles tun, was Sie mit der Set-Logik benötigen, und Sie können sogar zu dem Ergebnis kommen, das Sie suchen, aber das sind Standardprobleme, die von Datenbanken und SQL gelöst werden. Sie können sich linq auch für eine In-Code-Lösung ansehen.

    
rerun 02.12.2009 06:26
quelle
0

Klingt so, als müssten Sie eine Benutzeroberfläche erstellen, die die Erstellung eines einfachen Syntaxbaums ermöglicht. Wenn Sie GO drücken, können Sie den Baum begehen und einen LINQ-Ausdrucksbaum aus dieser Benutzeroberflächenstruktur erstellen. Führen Sie die LINQ-Abfrage aus, und verarbeiten Sie die Ergebnisse nach Bedarf. Ich würde Ihnen daher empfehlen, LINQ-Ausdrucksbäume zu lesen.

    
Phil Wright 04.12.2009 04:13
quelle