8

Je n'arrive pas à trouver un pointeur dans la bonne direction, je ne suis même pas sûr des termes que je devrais rechercher, mais d'innombrables heures de googling semblent me tourner en rond , si tout va bien, la ruche collective de l'intelligence de Stack Overflow peut aider. Le problème est ceci, j'ai besoin d'un moyen de filtrer des données dans ce que je peux seulement appeler un arbre logique composé. Actuellement, le système implémente un système de filtrage ET simple. Par exemple, disons que nous avons un ensemble de données de personnes. Vous ajoutez un tas de filtres tels que montrer toutes les personnes où (Sexe = Femme) ET (Âge> 23) ET (Âge < 30) ET (Statut = Simple). Assez facile, parcourir chaque élément, ajouter à une collection d'éléments valides seulement si toutes les conditions sont vraies.Besoin d'orientation vers l'arbre logique booléen évaluatif

Le problème que je rencontre est comment puis-je gérer l'utilisateur pouvant construire des requêtes complexes impliquées et est et ou? Je pense à quelque chose comme un arbre où chaque nœud représente et exprime l'évaluation de ses enfants à vrai ou faux. Un exemple simpliste serait - filtrer vers ((Sexe == Homme ET Age == 25) OU (Sexe == Femme ET Statut == Unique)) ET IQ> 120. Désolé, je ne peux pas penser à un meilleur exemple à le moment. Mais comment voulez-vous représenter ce type d'arbre d'expression, et évaluer les éléments d'une collection par rapport à ces filtres. Quelles sont les références qui pourraient aider? L'enfer, quelles sont les recherches foutues de Google qui pourraient mener dans une direction positive ?!

Merci à tous ceux qui peuvent vous aider.

Voici un exemple d'une requête de composé sous forme d'arbre à l'aide d'un ensemble de données de personnes

  • Requête - Montrez-moi tous les gens où le sexe est masculin et les yeux verts ou le sexe est une femme, les yeux sont bleus, ou le statut est unique. En forme de Paren (Sexe == Masculin & & Yeux == Vert) || (Sexe == Femme & & (Yeux bleu == || == Statut unique))

Ainsi Sous forme arbre im pensée

o-Root Node 
    - And - Sex = Male 
    - And - Eyes = Blue 
    - Or - Sex = Female 
    - And Eyes = Blue 
    - Or Status = Single 

Je crois que la solution est de représenter chaque noeud tel dans une structure de données comme

Node 
{ 
    OpType - AND or OR 
    ExpressionField - The field to evaluate 
    ExpressionOp - =, !=, >, >=, <, <= 
    ExpressionValue - the value to compare the field's value against 

    Function Evaluate() - returns a bool 
} 

donc, pour un noeud donné, évaluer les chilren, si vous êtes un noeud eT, puis retourne true si vos résultats d'expression dans tous les cas et vos enfants eT évaluer true ou tout OR enfant évalue à vrai et recurse.

Semble satisfaire toutes les conditions conceptuelles que je peux y jeter, mais nous le ferons depuis que je l'implémente. Je posterai le code réel plus tard quand son travail et les images pour aider à décrire ce problème mieux pour les autres.

+0

Suggérez-vous de clarifier la forme de vos données: SQL db? Je suppose que le tag "as3" fait référence à ActionScript 3: si oui, cherchez-vous vraiment des techniques spécifiques C# ou AS3, ou juste pour "théorie"? – BillW

+0

Les données sont en mémoire, bien que techniquement la mise en œuvre soit à la fois en flash et en silverlight, je suis beaucoup plus intéressé par la compréhension de la solution générale qu'une implémentation spécifique. Le point crucial du problème consiste à présenter une interface utilisateur à l'utilisateur qui lui permet de générer dynamiquement une requête complexe pour filtrer l'ensemble de données. J'ai besoin d'une structure de données solide pour représenter la requête. Jusqu'à présent, je donne les résultats suivants pour un nœud - Type - Et ou Ou - Champ - le champ de l'ensemble de données ce nœud cible - Opération - =, =,>, < <=, > = - Valeur - la valeur pour appliquer l'opération contre – JTtheGeek

+0

Explication plus claire! Je vous suggère de clarifier si la structure de données est en C#/SilverLight: si c'est le cas, je suppose que vous utiliserez Linq pour faire le "lifting". Si vous êtes déjà à un niveau élevé avec Linq, en utilisant des lambdas, des méthodes anonymes, etc., c'est une chose: si vous n'êtes pas, vous pouvez obtenir de bons conseils sur SO (si vous le demandez) sur les ressources d'étude Linq (imho Jon "C# in Depth" de Skeet est le meilleur livre C# de la planète avec une superbe couverture de Linq). Cela peut être sans rapport avec votre idée, mais vous pouvez utiliser un dictionnaire avec "any" en tant que clés et des méthodes exécutables (anonymes) en tant que Values. - BillW – BillW

Répondre

1

Votre analyse de l'expression ((Sexe == Homme ET Age == 25) OU (Sexe == Femme ET Statut == Unique)) ET IQ> 120 semble étrange. Je parse comme:

* And 
    * Or 
     * And 
      * == 
       * Sex 
       * Male 
      * == 
       * Eyes 
       * Blue 
     * And 
      * == 
       * Sex 
       * Female 
      * == 
       * Status 
       * Single 
    * > 
     * IQ 
     * 120 

Le type d'arbre serait:

Node 
{ 
    bool evaluate() 
} 

AndNode : Node 
{ 
    Node left 
    Node right 

    bool evaluate() 
    { 
     return left.evaluate() && right.evaluate() 
    } 
} 

// OrNode is similar 

EqualsNode : Node 
{ 
    Field field 
    Value value 

    bool evaluate() 
    { 
     return field.value() == value 
    } 
} 

// Likewise for <, >, etc 
+0

Je vois ce que vous faites, mais je pense que l 'expression interne (value - op - field tel que IQ> 120) peut toujours être évaluée à un simple bool, donc en y intégrant un tas de bool dans les nœuds. pour représenter le résultat de l'expression de ces nœuds, et un tas de And & Or aux nœuds représentant comment ce bool est absorbé dans l'arbre des résultats. Marquage aussi correct que pour le moment, je crois que c'est la meilleure réponse. – JTtheGeek

+0

Pas sûr de comprendre. Strictement evaluate() devrait prendre comme argument une sorte d'objet de contexte (peut-être une ligne d'une table), ce qui donnerait une valeur pour le champ (qui pourrait être différent pour chaque ligne). –

0

Je dois dire que c'est la raison pour laquelle les moteurs de bases de données sont construits. Vous pouvez faire tout ce dont vous avez besoin avec la logique de l'ensemble et vous pouvez même arriver au résultat que vous recherchez, mais les thèses sont des problèmes standard résolus par les bases de données et SQL. Vous pouvez aussi regarder linq pour une solution de code.

+0

Je pense qu'il veut dire sur la façon dont il peut construire dynamiquement cette expression dans sql. – user29964

+0

Oui, il s'agit de présenter une interface utilisateur solide à l'utilisateur pour lui permettre de créer facilement une requête. Je pense que je l'ai compris avec une structure arborescente assez simple et quelques fonctions récursives simples, peu je sais que d'autres ont étudié ce problème et aimeraient apprendre leurs pensées et expériences, mais pour l'instant n'ont pas compris comment trouver le autres. De plus, dans ce cas, toutes les données sont en mémoire. – JTtheGeek

+0

Une option serait de prendre l'ensemble des critères et permettre à l'utilisateur de créer un ensemble de critères et de stocker l'ensemble. Donc l'ensemble 1 serait Femme IQ> 120 Ensuite, permettre aux utilisateurs de spécifier plusieurs ensembles pour les orcs. Cela pourrait être fait graphiquement d'une manière intéressante permettant aux utilisateurs de faire glisser et déposer des ensembles. Peut-être pourriez-vous placer des ensembles à l'intérieur de l'ensemble pour créer une intersection ou une jointure d'ensembles. Juste une idée Désolé, je n'ai pas compris le point crucial de votre question. – rerun

0

Il semble que vous ayez besoin de créer une interface utilisateur permettant la création d'une arborescence d'analyse simple. Lorsque vous appuyez sur GO, vous pouvez ensuite parcourir l'arborescence et créer un arbre d'expression LINQ à partir de cette structure d'interface utilisateur. Exécutez la requête LINQ, puis traitez les résultats selon vos besoins. Je vous recommande donc de lire les arborescences d'expression LINQ.

1

Ces types de requêtes sont souvent présentées comme un tableau ed OR des clauses AND ées. C'est-à-dire, un format tabulaire dans lequel vous lisez ensemble plusieurs conditions AND ensemble, puis lues à OR eux. Cela conduit à une certaine répétition des conditions, mais il est facile pour les utilisateurs de lire, d'écrire et de comprendre. Votre échantillon ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120 ressemblerait

Sex == Male & Age == 25  & IQ > 120 
Sex == Female & Status == Single & IQ > 120 
1

Vous pouvez Google pour des termes tels que « calcul des prédicats » et «forme normale conjonctive.