평가 부울 논리 트리에 대한 지침이 필요합니다.
문제
올바른 방향으로 가는 포인터를 찾을 수 없는 것 같습니다. 제가 연구해야 할 용어가 무엇인지조차 확신할 수 없지만 수많은 시간의 인터넷 검색이 저를 맴돌게 하는 것 같습니다. 따라서 Stack 지능의 집단적 하이브가 있기를 바랍니다. 오버플로가 도움이 될 수 있습니다.
문제는 복합 논리 트리라고만 부를 수 있는 데이터를 필터링하는 방법이 필요하다는 것입니다.현재 시스템은 간단한 AND 필터링 시스템을 구현합니다.예를 들어, 사람 데이터 세트가 있다고 가정해 보겠습니다.(성별 = 여성) AND (나이 > 23) AND (나이 < 30) AND (상태 = 미혼)의 모든 사람을 표시하는 여러 필터를 추가합니다.충분히 쉽습니다. 각 항목을 반복하고 모든 조건이 true인 경우에만 유효한 항목 컬렉션에 추가합니다.
내가 겪고 있는 문제는 사용자가 and's 및 or's와 관련된 복잡한 쿼리를 작성할 수 있도록 어떻게 처리합니까?나는 각 노드가 자식을 참 또는 거짓으로 평가하는 표현과 표현을 나타내는 트리와 같은 것을 생각하고 있습니다.단순한 예는 다음과 같습니다. ((성별 == 남성 AND 연령 == 25) OR (성별 == 여성 AND 상태 == 미혼)) AND IQ > 120으로 필터링합니다.죄송합니다. 현재로서는 더 좋은 예가 생각나지 않습니다.그러나 이러한 유형의 식 트리를 표현하고 이러한 필터에 대해 컬렉션의 항목을 평가하는 방법은 무엇입니까?어떤 참고자료가 도움이 될까요?젠장, 긍정적인 방향으로 이어질 수 있는 빌어먹을 Google 검색은 무엇입니까?!
도움을 줄 수 있는 사람에게 감사드립니다.
다음은 사람 데이터 세트를 사용하는 트리 형식의 복합 쿼리의 예입니다.
- 쿼리 - 성별이 남성이고 눈이 녹색이거나 성별이 여성, 눈이 파란색이거나 상태가 미혼인 모든 사람을 보여주세요.Paren 형태 (Sex == Male && Eyes == Green) || (sex == 여성 && (눈 == 파란색 || 상태 == 싱글))))))
그래서 트리 형태로 나는 생각하고 있어요
o-Root Node
- And - Sex = Male
- And - Eyes = Blue
- Or - Sex = Female
- And Eyes = Blue
- Or Status = Single
나는 해결책이 다음과 같은 데이터 구조에서 각 노드를 나타내는 것이라고 생각합니다.
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
}
따라서 주어진 노드에 대해 어린이를 평가하고, AND 노드인 경우 표현식 결과가 true이고 모든 AND 하위 항목이 true로 평가되거나 OR 하위 항목이 true로 평가되어 반복되면 true를 반환합니다.
내가 던질 수 있는 모든 개념적 조건을 만족시키는 것 같지만 일단 구현하면 그렇게 될 것입니다.나중에 다른 사람들이 이 문제를 더 잘 설명할 수 있도록 실제 코드와 사진을 게시할 예정입니다.
해결책
((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120이라는 표현을 분석한 결과 이상해 보입니다.나는 그것을 다음과 같이 분석할 것이다:
* And
* Or
* And
* ==
* Sex
* Male
* ==
* Eyes
* Blue
* And
* ==
* Sex
* Female
* ==
* Status
* Single
* >
* IQ
* 120
트리 유형은 다음과 같습니다.
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
다른 팁
이러한 종류의 쿼리는 종종 OR
에드 배열 AND
에드 조항.즉, 여러 조건에 걸쳐 읽는 표 형식입니다. AND
함께 읽은 다음 아래로 읽어보세요. OR
그들을.이로 인해 조건이 일부 반복되지만 사용자가 읽고, 쓰고, 이해하기 쉽습니다.귀하의 샘플 ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120
다음과 같이 보일 것이다
Sex == Male & Age == 25 & IQ > 120
Sex == Female & Status == Single & IQ > 120
'술어 미적분' 및 '결합 정규형'과 같은 용어를 Google에서 검색할 수 있습니다.
이것이 데이터베이스 엔진이 구축되는 이유라고 말하고 싶습니다.설정된 논리를 사용하여 필요한 모든 작업을 수행할 수 있으며 원하는 결과에 도달할 수도 있지만 이러한 문제는 데이터베이스와 SQL로 해결되는 표준 문제입니다.코드 내 솔루션을 보려면 linq를 살펴볼 수도 있습니다.
간단한 구문 분석 트리를 생성할 수 있는 사용자 인터페이스를 생성해야 할 것 같습니다.GO를 누르면 트리를 탐색하고 해당 사용자 인터페이스 구조에서 LINQ 식 트리를 만들 수 있습니다.LINQ 쿼리를 실행한 다음 필요에 따라 결과를 처리합니다.그러므로 LINQ 표현식 트리를 읽어 보시기 바랍니다.