문제

올바른 방향으로 가는 포인터를 찾을 수 없는 것 같습니다. 제가 연구해야 할 용어가 무엇인지조차 확신할 수 없지만 수많은 시간의 인터넷 검색이 저를 맴돌게 하는 것 같습니다. 따라서 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 표현식 트리를 읽어 보시기 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top