Necesitan orientación hacia el árbol de la lógica booleana evaluativa
Pregunta
Me parece que no puede encontrar un puntero en la dirección correcta, ni siquiera estoy seguro de lo que son los términos que debería estar investigando, pero muchas horas de googlear parece que estar girando en círculos, así que espero que la colmena colectiva de la inteligencia de desbordamiento de pila puede ayudar.
El problema es el siguiente, necesito una forma de filtrar los datos en lo que sólo puedo llamar a un árbol lógico compuesto. Actualmente el sistema implementa un sistema simple y filtrado. Por ejemplo, digamos que tenemos un conjunto de datos de las 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). Es bastante fácil, iterar a través de cada elemento, agregar a una colección de artículos válidos sólo si cada condición es verdadera.
El problema que estoy encontrando es ¿Cómo manejo el usuario sea capaz de construir consultas complejas involucradas y de y o de? Estoy pensando en algo así como un árbol donde cada nodo representa la expresión y la evaluación de sus hijos a 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ía usted para representar este tipo de árbol de expresión, y evaluar los elementos de una colección en contra de estos filtros. ¿Cuáles son algunas referencias que ayudarían? Diablos, ¿cuáles son algunas maldita Google búsqueda que podría conducir en una dirección positiva?!
Gracias a cualquier persona que pueda proporcionar cualquier ayuda.
A continuación se muestra un ejemplo de una consulta compuesto en forma de árbol utilizando un conjunto de datos de las personas
- Consulta - 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 única. En forma Paren (Sex == Male && Eyes == verde) || (Sexo Femenino == && (Ojos Azul == == || Estado Individual))
Así árbol En forma im pensamiento
o-Root Node
- And - Sex = Male
- And - Eyes = Blue
- Or - Sex = Female
- And Eyes = Blue
- Or Status = Single
Creo que la solución es para representar cada nodo tal en 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 AND, a continuación, devolver true si la expresión da como resultado cierto y todos sus y niños como resultado true o cualquiera o niño se evalúa como verdadera y Recurse arriba.
parece satisfacer todas las condiciones conceptual que pueda lanzar en él, pero lo haremos ya que una vez que ponerlo en práctica. Voy a publicar el código real hasta más tarde, cuando su funcionamiento y fotos para ayudar a describir mejor este problema para los demás.
Solución
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 analizar 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
Otros consejos
Este tipo de consultas se presentan a menudo como una matriz OR
ed de cláusulas AND
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. Esto nos lleva a alguna repetición de las condiciones, pero es fácil para los usuarios leer, escribir y entender. Su ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120
muestra se vería
Sex == Male & Age == 25 & IQ > 120
Sex == Female & Status == Single & IQ > 120
Es posible que desee Google para términos como 'cálculo de predicados' y 'forma normal conjuntiva'.
Tengo que decir que esta es la razón por motores de bases de datos se construyen. Puede hacer todo lo que necesita con la lógica de conjunto e incluso se puede llegar al resultado que busca, pero tesis son problemas que resuelve estándar y bases de datos SQL. También puede mirar en LINQ para una solución de código.
Parece que es necesario crear una interfaz de usuario que permite la creación de un simple árbol de análisis sintáctico. Cuando las prensas de IR a continuación, puede recorrer el árbol y crear un árbol de expresión LINQ de esa estructura de interfaz de usuario. Ejecutar la consulta LINQ y luego procesar los resultados según sea necesario. Por lo tanto, le recomiendo que lea sobre LINQ árboles de expresión.