8

Non riesco a trovare un puntatore nella giusta direzione, non sono nemmeno sicuro di quali siano i termini che dovrei ricercare ma innumerevoli ore di googling sembrano girarmi in tondo , quindi spero che l'alveare collettivo di intelligence di Stack Overflow possa essere d'aiuto.Hai bisogno di una guida verso l'albero logico booleano valutativo

Il problema è questo, ho bisogno di un modo per filtrare i dati in ciò che posso solo chiamare un albero logico composto. Attualmente il sistema implementa un semplice sistema di filtraggio AND. Ad esempio, diciamo che abbiamo un set di dati di persone. Aggiungi un gruppo di filtri in modo da mostrare tutte le persone in cui (Sesso = Femmina) AND (Età> 23) E (Età < 30) E (Stato = Singolo). Abbastanza facile, iterare attraverso ogni elemento, aggiungere ad una collezione di articoli valida solo se ogni condizione è vera.

Il problema che sto incontrando è come gestisco l'utente che è in grado di compilare query complesse coinvolte in e e o? Sto pensando a qualcosa come un albero in cui ogni nodo rappresenta ed espressione che valuta i suoi figli a vero o falso. Un esempio semplicistico potrebbe essere: filtrare fino a ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) E IQ> 120. Scusa Non riesco a pensare ad un esempio migliore a il momento. Ma come andresti a rappresentare questo tipo di albero delle espressioni e a valutare gli elementi in una raccolta rispetto a questi filtri. Quali sono alcuni riferimenti che potrebbero aiutare? Accidenti, quali sono alcune dannate ricerche di Google che potrebbero portare a una direzione positiva ?!

Grazie a chiunque possa fornire aiuto.

Ecco un esempio di una query composti sotto forma dell'albero utilizzando un set di dati di persone

  • Query - Mostrami tutte le persone dove il sesso è un uomo e gli occhi sono verdi o il sesso è di sesso femminile, gli occhi sono blu, o lo stato è singolo. In forma Paren (Sesso == Maschio & & Occhi == Verde) || (Sesso == femmina & & (Occhi Blu == || Stato == singolo))

Così in forma di albero im Pensando

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

Credo che la soluzione è quella di rappresentare ogni nodo come in una struttura di dati come

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 
} 

Così, per un dato nodo, valutare le chilren, se sei un nodo e, poi tornare vero se i risultati di espressione in un vero e tutti i tuoi e bambini restituiscono true o qualsiasi O il bambino è valutato come vero e recitato.

Sembra soddisfare tutte le condizioni concettuali che posso lanciare, ma da quando lo implementerò. Pubblicherò il codice reale più tardi quando funziona e le immagini per aiutare a descrivere meglio questo problema per gli altri.

+0

Suggerisco di chiarire in che forma si trovano i dati: SQL db? Presumo che il tag "as3" si riferisca ad ActionScript 3: in tal caso, stai davvero cercando tecniche specifiche per C# o AS3, o solo per "teoria"? – BillW

+0

I dati sono in memoria, anche se tecnicamente l'implementazione è sia in flash che in silverlight, sono molto più interessato a capire la soluzione generale rispetto a un'implementazione specifica. Il nodo del problema consiste nel presentare all'utente un'interfaccia utente che consenta loro di creare dinamicamente una query complessa per filtrare il set di dati. Ho bisogno di una solida struttura dati per rappresentare la query. Finora ho il seguente per un nodo - Tipo - And o Or - Il campo - il campo del dataset questo nodo si rivolge - Funzionamento -! =, =,>, < <=, > = - Valore - il valore per applicare l'operazione contro – JTtheGeek

+0

spiegazione più chiara! Vi suggerisco di chiarire se la struttura dei dati è in C#/SilverLight: in tal caso, presumo che userete Linq per eseguire il "sollevamento pesante". Se sei già di alto livello con Linq, usando lambdas, metodi anonimi, ecc., Questa è una cosa: se non lo sei, puoi ottenere un buon consiglio su SO (se lo chiedi) sulle risorse di studio di Linq (imho Jon "C# in Depth" di Skeet è il miglior libro di C# sul pianeta con una superba copertura di Linq). Questo può essere irrilevante per la tua idea, ma puoi usare un dizionario con "qualsiasi cosa" come chiavi e metodi eseguibili (anonimi) come Valori. - BillW – BillW

risposta

1

La tua analisi dell'espressione ((Sesso == Maschio E Età == 25) O (Sesso == Femmina E Stato == Singolo)) E IQ> 120 sembra strano. Vorrei analizzarlo come:

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

Il tipo di albero sarebbe:

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

Vedo quello che stai facendo, ma penso che l'espressione interiore (valore - op - campo come IQ> 120) possa sempre essere valutata come un semplice bool, in modo da ridurla a un sacco di bool all'interno dei nodi per rappresentare il risultato dell'espressione di quei nodi e un gruppo di And & Or ai nodi che rappresentano il modo in cui quel bool viene assorbito nell'albero dei risultati. Segnando come corretti come adesso, credo che questa sia la migliore risposta. – JTtheGeek

+0

Non sono sicuro di aver capito. Strettamente valutare() dovrebbe assumere come argomento una sorta di oggetto contesto (magari una riga di una tabella), che fornirebbe un valore per il campo (che potrebbe essere diverso per ogni riga). –

0

Devo dire che questo è il motivo per cui i motori di database sono costruiti. Puoi fare tutto ciò che ti serve con la logica impostata e potresti persino arrivare al risultato che stai cercando, ma questi sono problemi standard risolti da database e SQL. Puoi anche guardare a linq per una soluzione in codice.

+0

Penso che intenda come può costruire dinamicamente questa espressione all'interno di sql. – user29964

+0

Sì, si tratta di presentare un'interfaccia utente solida all'utente che consente loro di creare facilmente una query. Penso di aver capito con una struttura ad albero abbastanza semplice e alcune semplici funzioni ricorsive, un pò so che altri hanno studiato questo problema e vorrebbe imparare i loro pensieri ed esperimenti, ma ancora non ho capito come trovare il altri. Inoltre, in questo caso tutti i dati sono in memoria. – JTtheGeek

+0

Un'opzione consisterebbe nel prendere il Set di criteri e consentire all'utente di creare un insieme di criteri e memorizzare il Set. Quindi, il Set 1 sarebbe Femmina IQ> 120 Quindi consentire agli utenti di specificare più set per gli ors. Questo potrebbe essere fatto graficamente in un modo interessante che consente agli utenti di trascinare e rilasciare set. Forse potresti inserire set all'interno di set per creare un'intersezione o un join di set. Solo un'idea Spiacente di non aver trovato il nocciolo della tua domanda al primo giro. – rerun

0

Sembra che sia necessario creare un'interfaccia utente che consenta la creazione di un albero di analisi semplice. Quando le presse GO si può camminare sull'albero e creare un albero di espressioni LINQ da quella struttura dell'interfaccia utente. Esegui la query LINQ e quindi elabora i risultati secondo necessità. Pertanto ti consiglio di leggere gli alberi di espressione LINQ.

1

Questi tipi di query sono spesso presentati come un array OR ED di AND clausole ed. Cioè, un formato tabellare in cui si legge su più condizioni AND insieme, quindi si legge su OR. Ciò porta ad alcune ripetizioni di condizioni, ma è facile per gli utenti leggere, scrivere e capire. Il tuo campione ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120 sarà simile

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

Si potrebbe desiderare di Google per termini come 'calcolo dei predicati' e 'forma normale congiuntiva'.