Microsoft Fabric 그래프 데이터 필터링 및 집계

필터링하면 결과가 중요한 행으로 좁혀질 수 있습니다. 집계는 이러한 행을 개수, 합계 및 평균으로 요약합니다. 이 문서에서는 Microsoft Fabric 그래프에 대해 GQL 쿼리에서 두 기술을 모두 적용하는 방법을 보여 줍니다.

이 예제에서는 소셜 네트워크 샘플 데이터 세트를 사용합니다. 쿼리 흐름과 문장에 대한 종단 간 설명은 GQL 언어 가이드를 참조하세요.

이 글을 사용하여 행 및 패턴 필터링, 그룹 및 비그룹 집계, 집계 특정 필터, 조건부 라우팅을 활용하세요. 멀티홉 패턴을 구성하고 경로를 선택하는 경우, 그래프 패턴 쿼리 작성(Write graph pattern queries)을 참조하세요. 즉시 적응할 수 있는 비즈니스 작업에 대해서는 '일반적인 GQL 쿼리 작성'을 참조하세요.

사전 요구 사항

FILTER를 사용하여 행 필터링

조건을 충족하는 행만 유지하는 데 사용합니다 FILTER . 일치하는 결과를 좁히려면 FILTER 뒤에 MATCH을 배치합니다.

다음 쿼리는 이름과 생일이 있는 모든 여성을 반환합니다.

MATCH (p:Person)
FILTER p.gender = 'female'
RETURN p.firstName, p.lastName, p.birthday

여러 조건을 AND 및 OR와 같이 결합합니다. 예를 들어 다음 쿼리는 1990년 이전에 태어난 모든 여성의 이름을 반환합니다.

MATCH (p:Person)
FILTER p.gender = 'female' AND p.birthday < 19900101
RETURN p.firstName, p.lastName

Tip

조건이 어떤 노드나 엣지가 매치에 참여할 수 있는지 정의할 때는 인라인 WHERE 절을 사용하세요. 조건이 이전 문장에서 생성된 행에 적용될 때 사용됩니다 FILTER . 술어 배치는 최단 경로 결과를 변경할 수 있습니다; 경로 선택 전후 술어 배치를 참조하세요.

패턴 일치 중 필터링

WHERE 패턴 내부의 인라인 MATCH 절은 어떤 노드와 간선이 매칭 조건을 충족하는지 제한합니다. 쿼리 옵티마이저는 스캔 중에 동등한 조건식을 적용할 수 있으므로, 인라인 구문이 별도의 FILTER보다 본질적으로 더 빠른 것은 아닙니다. 의도된 의미를 표현하는 형식을 선택하세요.

예를 들어 1994년 이전에 태어난 사람을 근무하는 회사와 함께 찾으려면 이름이 'A'로 시작하는 회사로 결과를 제한합니다.

MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name

같은 방식으로 에지 속성을 필터링합니다. 예를 들어 2000년 이상 회사에서 일하기 시작한 사용자만 반환하려면 다음을 수행합니다.

MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)
RETURN p.firstName, p.lastName, c.name, w.workFrom

인라인과 사후 매칭 필터링 중 선택에 관한 자세한 내용은 'GQL 쿼리 성능 최적화'를 참조하세요.

필터에서 null 값 처리

GQL은 세 값 논리를 사용하며, 조건자는 TRUE, FALSE, 또는 UNKNOWN로 평가됩니다. 속성 값이 null이면, 비교 결과로 UNKNOWN가 반환됩니다. FILTER 는 UNKNOWN 일치하지 않으므로 행은 제외됩니다.

IS NULL 및 IS NOT NULL를 사용하여 null 값을 명시적으로 테스트합니다.

-- Only include people whose browser is known
MATCH (p:Person)
FILTER p.browserUsed IS NOT NULL
RETURN p.firstName, p.browserUsed

속성이 null일 수 있는 경우 기본값을 대체하는 데 사용합니다 coalesce() .

MATCH (p:Person)
RETURN p.firstName, coalesce(p.browserUsed, 'Unknown browser') AS browser

Caution

NULL = NULL는 UNKNOWN가 아니라 TRUE로 계산됩니다. 항상 null 값을 테스트할 때는 IS NULL을(를) 사용하고, 같음을 테스트하지 마십시오.

RETURN을 사용하여 결과 집계

집계 함수를 RETURN 사용하여 결과를 요약합니다. 그래프는 다음과 같은 집계 함수들을 지원합니다: COUNT, , SUMAVG, . MINCOLLECT_ELEMENTSMAXCOLLECT_LISTCOLLECT_ONE

예를 들어 그래프의 모든 사람을 계산하려면 다음을 수행합니다.

MATCH (p:Person)
RETURN count(*) AS totalPeople

직원을 고용하는 고유 회사 수와 같은 고유 값을 계산하려면 다음을 수행합니다.

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT c) AS companyCount

하나의 집합체에 대한 필터 입력

집계 후에 추가 FILTER (WHERE predicate) 하여 그 집계의 입력만 필터링하세요. 같은 RETURN 집합체 내 다른 집합체들은 여전히 모든 입력 행을 받습니다.

MATCH (p:Person)
RETURN count(*) AS allPeople,
       count(*) FILTER (WHERE p.birthday < 19900101) AS peopleBornBefore1990

집계 필터 안에 LIMIT를 추가하여 조건을 충족하는 행을 최대 해당 개수만큼 사용하세요. 쿼리는 집합별 한계 이전에 술어를 적용합니다.

MATCH (p:Person)
RETURN count(*) FILTER (WHERE p.birthday < 19900101 LIMIT 100) AS sampleCount

집계별 FILTER 및 LIMIT은 쿼리의 나머지 부분에서 행을 제거하지 않습니다. 행 스트림을 필터링하려면 WHERE 구문 또는 매치 수준 FILTER 절을 사용하세요.

가치를 수집하세요

입력 값마다 하나의 리스트 요소를 반환하는 데 사용 COLLECT_LIST 하세요. null 값도 포함해서요. 중복 항목을 제거하기 위해 추가 DISTINCT 하세요.

MATCH (p:Person)
RETURN collect_list(DISTINCT p.browserUsed) AS browsers

COLLECT_ONE 는 null이 아닌 입력 값을 반환합니다. 선택된 값은 결정적이지 않으니, 그룹 내 어떤 값이든 허용될 때만 사용하세요.

COLLECT_ELEMENTS 리스트 값 입력을 받아들이고 그 요소들을 하나의 리스트로 연결한다:

MATCH (p:Person)
RETURN collect_elements([p.firstName, p.lastName]) AS names

열을 그룹화하지 않으면 입력 행이 없는 집계 쿼리는 COLLECT_ELEMENTS 및 COLLECT_LIST에서는 빈 목록을 반환하고 COLLECT_ONE에서는 null을 반환합니다.

GROUP BY를 사용하여 결과 그룹화

GROUP BY 공유 값별로 행을 그룹화하고 각 그룹 내의 집계를 계산하는 데 사용합니다RETURN. 이 그룹화는 SQL GROUP BY에 해당하는 GQL입니다.

예를 들어 회사당 직원 수를 계산하려면 다음을 수행합니다.

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyId = c.id, companyName = c.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
ORDER BY employeeCount DESC

여러 열을 그룹화하고 여러 집계를 한 번에 계산합니다. 예를 들어 성별 및 브라우저별로 사람 수와 생일 범위를 세분화하여 가장 일반적인 10가지 조합을 반환합니다.

MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
       browser,
       count(*) AS personCount,
       min(p.birthday) AS earliestBirthday,
       max(p.birthday) AS latestBirthday
GROUP BY gender, browser
ORDER BY personCount DESC
LIMIT 10

메모

모든 비 집계 식은 RETURN에 있는 경우에 GROUP BY에서도 나타나야 합니다. GROUP BY에 포함되지 않는 식은 집계 함수를 사용해야 합니다.

집계된 결과 정렬 및 제한

ORDER BY 및 LIMIT을 GROUP BY와 함께 사용하여 상위 N개 결과를 찾습니다.

예를 들어 주민 수별로 상위 5개 도시를 찾으려면 다음을 수행합니다.

MATCH (p:Person)-[:isLocatedIn]->(city:City)
LET cityId = city.id, cityName = city.name
RETURN cityId, cityName, count(*) AS residentCount
GROUP BY cityId, cityName
ORDER BY residentCount DESC
LIMIT 5

중요합니다

ORDER BY 전에 LIMIT 놓습니다. LIMIT 는 이미 정렬된 결과 집합에 항상 적용됩니다.

조건문이 포함된 행 경로

조건문을 사용하여 입력되는 각 행을 처음으로 일치하는 분기로 라우팅하세요. 입력은 집계뿐만 아니라 이전 쿼리 단계에서 올 수 있습니다. 예를 들어, 다음 쿼리는 직원 수를 계산한 후 기업을 분류합니다:

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyId = c.id, companyName = c.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
NEXT
WHEN employeeCount >= 100u THEN
  RETURN companyId, companyName, employeeCount, 'Large' AS category
WHEN employeeCount >= 10u THEN
  RETURN companyId, companyName, employeeCount, 'Medium' AS category
ELSE
  RETURN companyId, companyName, employeeCount, 'Small' AS category

브랜치는 표현식만 반환하는 것이 아니라 완전한 쿼리 문과 중첩된 프로시저를 실행할 수 있습니다. 다음 예시는 세 개의 입력 행을 서로 다른 분기 형태로 보냅니다. 한 분기는 a MATCH를 실행하고, 다른 분기는 두 개의 집계체를 UNION ALL 결합한 후 결과를 집계하며, 대체 분기는 상수를 반환합니다:

FOR selector IN [1, 2, 3]
RETURN selector
NEXT
WHEN selector = 1 THEN
  MATCH (:Person)-[:knows]->(:Person)
  RETURN count(*) AS total, 'Knows edges' AS category
WHEN selector = 2 THEN {
  MATCH (:Person)-[:workAt]->(:Company)
  RETURN count(*) AS partialCount
  UNION ALL
  MATCH (:Person)-[:studyAt]->(:University)
  RETURN count(*) AS partialCount
  NEXT
  RETURN sum(partialCount) AS total, 'Affiliation edges' AS category
}
ELSE
  RETURN 0u AS total, 'No selected metric' AS category

쿼리 엔진은 각 행에 대해 술어를 순서대로 평가합니다. 가장 먼저 일치하는 분기만 실행합니다. 조건식이 UNKNOWN로 평가되면 평가는 다음 분기로 계속됩니다. ELSE가 없으면 WHEN 분기와 일치하지 않는 행은 생략됩니다.

조건문은 표현식과 CASE 다릅니다. 그래프는 등식 기반 값 선택을 위한 간단한 CASE <expression> WHEN <value> 표현식을 지원합니다. 검색된 CASE WHEN <predicate> 표현은 지원되지 않습니다. 자세한 내용은 조건문 명제를 참조하세요.