8

Parece que no puedo encontrar un puntero en la dirección correcta, ni siquiera estoy seguro de cuáles son los términos que debería investigar, pero las innumerables horas de búsqueda en Google me parecen girar en círculos , así que con suerte la colmena colectiva de inteligencia de Stack Overflow puede ayudar.Necesito orientación hacia el árbol de lógica booleana evaluativa

El problema es este, necesito una forma de filtrar datos en lo que solo puedo llamar un árbol de lógica compuesta. Actualmente, el sistema implementa un sistema de filtrado AND simple. Por ejemplo, digamos que tenemos un conjunto de datos de personas. Se agrega un montón de filtros tales que muestran todas las personas que (Sexo = Mujer) Y (edad> 23) y (Edad < 30) y (estado = Individual). Lo suficientemente fácil, iterar a través de cada elemento, agregar a una colección de elementos válida solo si todas las condiciones son verdaderas.

El problema que estoy enfrentando es ¿cómo puedo manejar que el usuario pueda crear consultas complejas involucradas en y's and or's? Estoy pensando en algo así como un árbol en el que cada nodo representa y la expresión evalúa sus hijos en verdadero o falso. Un ejemplo sería simplista - filtre a ((sexo masculino y la edad == == 25) o (Sexo Femenino == == y el estado individual)) y el CI> 120. Lo siento, no puedo pensar en un mejor ejemplo a el momento. Pero, ¿cómo harías para representar este tipo de árbol de expresiones y evaluar los elementos de una colección con estos filtros? ¿Cuáles son algunas referencias que podrían ayudar? Demonios, ¿qué maldita búsqueda de Google podría llevar a una dirección positiva?

Gracias a cualquier persona que pueda proporcionar cualquier ayuda.

Aquí es un ejemplo de una consulta compuesto en forma de árbol utilizando un conjunto de datos de las personas

  • consultas - Muéstrame todas las personas donde el sexo es hombre y los ojos son de color verde o el sexo es femenino, los ojos son de color azul, o el estado es único. En forma Paren (Sex == Male & & Eyes == verde) || (Sexo Femenino == & & (Ojos Azul == == || Estado Individual))

lo tanto en forma de árbol im Pensando

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

creo que la solución es representar cada nodo en tales una estructura de datos como

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 
} 

Así que para un nodo dado, evaluar los chilren, si usted es un nodo y, a continuación, devolver verdadero si la expresión da como resultado cierto y todos sus hijos y como resultado true o cualquier O el niño evalúa verdadero y recurrente.

Parece que satisface todas las condiciones conceptuales que puedo ofrecer, pero lo haremos desde que lo implemente. Voy a publicar el código real más tarde cuando esté funcionando e imágenes para ayudar a describir este problema mejor para los demás.

+0

sugerimos que aclarar qué forma los datos están en: db SQL? Supongo que la etiqueta "as3" se refiere a ActionScript 3: si es así, ¿realmente está buscando técnicas específicas de C# o AS3, o simplemente para "teoría"? – BillW

+0

Los datos están en la memoria, aunque técnicamente la implementación está tanto en flash como en Silverlight, estoy mucho más interesado en comprender la solución general que en una implementación específica. El quid de la cuestión consiste en presentar una interfaz de usuario para el usuario que les permite construir dinámicamente una consulta compleja para filtrar el conjunto de datos. Necesito una estructura de datos sólida para representar la consulta. Hasta ahora tengo el siguiente para un nodo - Tipo - Y u O - campo - el campo del conjunto de datos de este nodo se dirige - Funcionamiento -! =, =,>, < <=, > = - Valor - el valor para aplicar la operación contra – JTtheGeek

+0

¡Explicación más clara! Sugiero que aclare si la estructura de datos está en C#/SilverLight: si es así, supongo que usará Linq para hacer el "trabajo pesado". Si ya está en un nivel alto con LINQ, utilizando lambdas, métodos anónimos, etc., eso es una cosa: si no está, se puede obtener un buen consejo sobre SO (si se solicita) sobre los recursos de estudio Linq (en mi humilde opinión Jon "C# in Depth" de Skeet es el mejor libro de C# en el planeta con una excelente cobertura de Linq). Esto puede ser irrelevante para su idea, pero puede usar un diccionario con "lo que sea" como claves y métodos ejecutables (anónimos) como Valores. - billw – BillW

Respuesta

1

Su análisis de la expresión ((sexo masculino y la edad == == 25) o (Sexo Femenino == == y el estado individual)) y el CI> 120 parece extraño. Me gustaría analizarlo como:

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

El tipo de árbol sería:

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

que ver lo que estás haciendo, pero creo que la expresión interno (valor - op - campo, tales como el CI> 120) siempre se puede evaluar a un simple bool, por lo que la factorización abajo usted termina con un montón de bool dentro de los nodos para representar el resultado de esa expresión de nodos, y un grupo de And & Or en los nodos que representa cómo ese bool se absorbe en el árbol de resultados. Marcado como correcto en este momento, creo que esta es la mejor respuesta. – JTtheGeek

+0

No estoy seguro de que entiendo. Estrictamente evaluar() debe tener como argumento una especie de objeto de contexto (tal vez una fila de una tabla), lo cual produciría un valor para el campo (que puede ser diferente para cada fila). –

0

tengo que decir que esta es la razón por motores de bases de datos se construyen. Puede hacer todo lo que necesite con la lógica establecida e incluso puede llegar al resultado que está buscando, pero estos son problemas estándar resueltos por bases de datos y SQL. También puede consultar linq para obtener una solución de código.

+0

Creo que se refiere a cómo puede construir dinámicamente esta expresión dentro de sql. – user29964

+0

Sí, se trata de presentar una interfaz de usuario sólida para el usuario que le permite crear fácilmente una consulta. Creo que lo he descubierto con una estructura de árbol bastante simple y algunas funciones recursivas simples, aunque sé que otros han estudiado este problema y les gustaría aprender sus pensamientos y experimentos, pero hasta el momento no han descubierto cómo encontrar el otros. También, en este caso, todos los datos están en la memoria. – JTtheGeek

+0

Una opción sería tomar el conjunto de criterios y permitir al usuario crear un conjunto de criterios y y almacenar el conjunto. Así El conjunto 1 habría IQ Mujer> 120 luego permitir a los usuarios especificar múltiples conjuntos para las RUP. Esto podría hacerse gráficamente de una manera interesante, permitiendo a los usuarios arrastrar y soltar conjuntos. Tal vez podría colocar conjuntos dentro del conjunto para crear una intersección o una combinación de conjuntos. Solo una Idea. Perdón. No entendí el meollo de su pregunta la primera vez. – rerun

0

Parece que necesita crear una interfaz de usuario que permita la creación de un árbol de análisis simple. Cuando las imprentas GO, puede caminar por el árbol y crear un árbol de expresión LINQ a partir de esa estructura de interfaz de usuario. Ejecute la consulta LINQ y luego procese los resultados según sea necesario. Por lo tanto, le recomiendo que lea sobre los árboles de expresión LINQ.

1

Este tipo de consultas se presentan a menudo como una matriz de OR ed AND cláusulas ed. Es decir, un formato de tabla en la que se lee a través de múltiples condiciones AND ed juntos, y luego busque debajo OR ellos. Eso lleva a una cierta repetición de las condiciones, pero es fácil de leer, escribir y entender por los usuarios. Su muestra ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120 se vería

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

Es posible que desee Google para términos como 'cálculo de predicados' y 'forma normal conjuntiva'.

Cuestiones relacionadas