버전 드롭다운 목록을 사용하여 서비스를 전환합니다. 탐색에 대해 자세히 알아봅니다.
적용 대상: ✅ Microsoft Fabric ✅ Azure Data Explorer
이 페이지에서는 그래프 데이터 세트를 빠르게 탐색하고 구조, 노드, 에지 및 속성에 대한 일반적인 질문에 답변하기 위한 재사용 가능한 KQL(Kusto Query Language) 패턴을 제공합니다.
팁 (조언)
디자인 및 성능 지침을 찾고 계신가요? 그래프 의미 체계에 대한 모범 사례를 참조하세요.
일반적인 분석 쿼리
이러한 재사용 가능한 쿼리 패턴은 모든 그래프 모델에서 작동하며 그래프 데이터 세트의 구조와 특성을 이해하는 데 도움이 됩니다. 아래 예제에서는 샘플 데이터베이스의 도움말 클러스터 에서 사용할 수 있는 샘플 그래프를 사용합니다. 이러한 그래프에 대한 자세한 내용은 그래프 샘플 데이터 세트 및 예제를 참조하세요. 이러한 쿼리를 사용하여 새 그래프를 탐색하거나, 기본 분석을 수행하거나, 보다 복잡한 그래프 조사를 위한 시작점으로 사용할 수 있습니다.
그래프 개요 및 통계
그래프의 기본 특성을 이해하는 것은 분석 계획 및 성능 최적화에 필수적입니다. 이러한 쿼리는 그래프 크기 및 구조에 대한 기본 메트릭을 제공합니다.
총 노드 및 에지 개수:
이러한 쿼리를 사용하여 그래프 데이터 세트의 규모를 파악합니다. 노드 및 에지 개수는 적절한 쿼리 전략을 결정하고 잠재적인 성능 고려 사항을 식별하는 데 도움이 됩니다. 이러한 예제에서는 기본 그래프 작업을 학습하는 데 적합한 그래프를 사용합니다Simple.
// Get node count
graph('Simple')
| graph-match (node)
project node
| count
| 수량 |
|---|
| 11 |
// Get edge count
graph('Simple')
| graph-match (source)-[edge]->(target)
project edge
| count
| 수량 |
|---|
| 20 |
그래프 요약 통계 가져오기:
이 결합된 쿼리는 단일 결과에 두 메트릭을 효율적으로 제공하여 초기 그래프 평가 및 보고에 유용합니다. 이 예제에서는 그래프를 사용하는 Simple기술을 보여 줍니다.
let nodes = view() { graph('Simple') | graph-match (node) project node | count };
let edges = view() { graph('Simple') | graph-match (source)-[edge]->(target) project edge | count };
union withsource=['Graph element'] nodes, edges
| 그래프 요소 | 수량 |
|---|---|
| nodes | 11 |
| 가장자리 | 20 |
그래프를 테이블로 변환하기 위한 대안:
기본 계산의 graph-to-table 경우 패턴 일치 오버헤드 없이 그래프 요소를 직접 내보내기 때문에 연산자가 더 효율적일 수 있습니다. 이 예제에서는 동일한 Simple 그래프를 사용하는 대체 방법을 보여 줍니다.
let nodes = view() { graph('Simple') | graph-to-table nodes | count };
let edges = view() { graph('Simple') | graph-to-table edges | count };
union nodes, edges
| 수량 |
|---|
| 11 |
| 20 |
노드 분석
노드 분석을 통해 그래프의 엔터티, 해당 형식 및 배포를 이해할 수 있습니다. 이러한 패턴은 데이터 품질 평가 및 스키마 이해에 필수적입니다.
모든 노드 유형(레이블)을 검색합니다.
이 쿼리는 그래프의 다양한 엔터티 형식과 해당 빈도를 표시합니다. 이를 사용하여 데이터 모델을 이해하고, 가장 일반적인 엔터티 형식을 식별하고, 잠재적인 데이터 품질 문제를 파악할 수 있습니다. 이 예제에서는 Simple 그래프를 사용하며, 이 그래프에는 Person, Company 및 City 엔터티가 포함되어 있습니다.
graph('Simple')
| graph-match (node)
project labels = labels(node)
| mv-expand label = labels to typeof(string)
| summarize count() by label
| order by count_ desc
| label | 카운트_ |
|---|---|
| 사람 | 5 |
| 회사 | 3 |
| 도시 | 3 |
여러 레이블이 있는 노드를 찾습니다.
동시에 여러 범주에 속하는 노드를 식별합니다. 이는 데이터 모델에서 겹치는 분류 및 복잡한 엔터티 관계를 이해하는 데 유용합니다. 이 예제에서는 여러 레이블 분류가 BloodHound_Entra있는 Microsoft Entra 개체를 포함하는 그래프를 사용합니다.
graph('BloodHound_Entra')
| graph-match (node)
project node_id = node.id, labels = labels(node), label_count = array_length(labels(node))
| where label_count > 1
| take 3
| node_id | labels | 레이블_수량 |
|---|---|---|
| 2 | [<br> "AZBase",<br> "AZServicePrincipal"<br>] |
2 |
| 4 | [<br> "AZBase",<br> "AZUser"<br>] |
2 |
| 5 | [<br> "AZBase",<br> "AZUser"<br>] |
2 |
형식별 샘플 노드:
특정 노드 형식의 대표적인 예제를 검색하여 해당 구조 및 속성을 이해합니다. 데이터 탐색 및 쿼리 개발에 필수적입니다. 이 예제에서는 그래프를 BloodHound_Entra 사용하여 Microsoft Entra 환경에서 AZUser 노드 속성을 탐색합니다.
graph('BloodHound_Entra')
| graph-match (node)
where labels(node) has "AZUser"
project node_id = node.id, properties = node.properties
| sample 2
| node_id | properties |
|---|---|
| 5 | {<br> "lastseen": "2025-08-11T09:21:19.002Z[UTC]",<br> "lastcollected": "2025-08-11T09:21:07.472380514Z[UTC]",<br> "enabled": true,<br> "displayname": "Jack Miller",<br> "name": "JMILLER@PHANTOMCORP.ONMICROSOFT.COM",<br> "tenantid": "aaaabbbb-0000-cccc-1111-dddd2222eeee",<br> "objectid": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",<br> "onpremid": "",<br> "usertype": "Member",<br> "title": "",<br> "userprincipalname": "jmiller@phantomcorp.onmicrosoft.com",<br> "system_tags": "admin_tier_0",<br> "pwdlastset": "2021-06-16T17:51:03Z[UTC]",<br> "onpremsyncenabled": false,<br> "whencreated": "2021-06-16T17:29:16Z[UTC]",<br> "email": ""<br>} |
| 10 | {<br> "lastseen": "2025-08-11T09:21:07.472380514Z[UTC]",<br> "onpremid": "",<br> "usertype": "Member",<br> "title": "",<br> "lastcollected": "2025-08-11T09:21:07.472380514Z[UTC]",<br> "enabled": true,<br> "userprincipalname": "cjackson@phantomcorp.onmicrosoft.com",<br> "system_tags": "admin_tier_0",<br> "displayname": "Chris Jackson",<br> "pwdlastset": "2022-07-19T15:18:49Z[UTC]",<br> "onpremsyncenabled": false,<br> "name": "CJACKSON@PHANTOMCORP.ONMICROSOFT.COM",<br> "tenantid": "aaaabbbb-0000-cccc-1111-dddd2222eeee",<br> "whencreated": "2022-07-19T15:01:55Z[UTC]",<br> "email": "cjackson@phantomcorp.onmicrosoft.com",<br> "objectid": "bbbbbbbb-1111-2222-3333-cccccccccccc"<br>} |
에지 분석
그래프의 관계를 이해하는 것은 패턴, 데이터 품질 문제 및 잠재적 분석 방향을 식별하는 데 매우 중요합니다.
모든 에지 형식 검색 (다른 그래프 스키마에서 작동):
이 쿼리는 그래프의 모든 관계 유형을 식별하여 분석에 사용할 수 있는 연결을 이해하는 데 도움이 됩니다. 다른 그래프는 에지 형식에 서로 다른 속성 이름을 사용하므로 여러 변형이 제공됩니다. 이 예제에서는 그래프를 BloodHound_Entra 사용하여 Microsoft Entra 환경에서 사용 권한 관계를 표시합니다.
graph('BloodHound_Entra')
| graph-match (source)-[edge]->(target)
project edge_labels = labels(edge)
| mv-expand label = edge_labels to typeof(string)
| summarize count() by label
| top 5 by count_ desc
| label | 카운트_ |
|---|---|
| AZMGAddOwner | 403412 |
| AZMGAddSecret | 345324 |
| AZAddSecret | 24666 |
| AZContains | 12924 |
| AZRunsAs | 6269 |
대부분의 연결된 노드(최고 수준)를 찾습니다.
노드 차수 분석은 그래프에서 가장 영향력 있거나 중심에 위치한 엔터티를 나타냅니다. 높은 수준의 노드는 주요 플레이어, 병목 상태 또는 중요한 인프라 구성 요소를 나타내는 경우가 많습니다. 이 예제에서는 연결 패턴 및 영향을 분석하는 데 이상적인 소셜 네트워크 데이터 세트인 그래프를 사용합니다LDBC_SNB_Interactive.
// Find nodes with highest total degree (in + out)
graph('LDBC_SNB_Interactive')
| graph-match (node)
project node_id = node.id,
in_degree = node_degree_in(node),
out_degree = node_degree_out(node),
total_degree = node_degree_in(node) + node_degree_out(node)
| order by total_degree desc
| take 5
| node_id | 입력 차수 | 아웃-디그리 | total_degree |
|---|---|---|---|
| 0 | 41076 | 1 | 41077 |
| 1 | 35169 | 1 | 35170 |
| 50 | 12080 | 1 | 12081 |
| 49 | 11554 | 1 | 11555 |
| 58 | 7571 | 1 | 7572 |
들어오는 연결이 가장 많은 노드를 찾습니다.
입도가 높은 노드는 종종 영향의 목표, 인기 있는 목적지, 또는 중심 자원으로 사용됩니다. 소셜 네트워크에서 이들은 영향력 있는 사람들이 될 수 있습니다. 인프라 그래프에서 중요한 서비스일 수 있습니다. 이 예제에서는 그래프를 LDBC_Financial 사용하여 가장 많은 트랜잭션을 수신하는 계정을 식별합니다.
graph('LDBC_Financial')
| graph-match (node)
project node_id = node.node_id,
node_labels = labels(node),
in_degree = node_degree_in(node)
| order by in_degree desc
| take 3
| node_id | 노드 레이블 | in_degree |
|---|---|---|
| 계정::99079191802151398 | [ 계정 ] |
314 |
| 계정::4868391197187506662 | [ 계정 ] |
279 |
| 계정::4896538694858573544 | [ 계정 ] |
184 |
가장 많은 출발 연결(아웃디그리)을 가진 노드를 찾습니다.
높은 수준의 노드는 종종 영향, 배포자 또는 커넥터 허브의 원본입니다. 이러한 엔터티는 일반적으로 많은 관계를 시작하거나 다른 사용자에게 리소스를 배포합니다. 이 예제에서는 그래프를 LDBC_Financial 사용하여 트랜잭션을 가장 잘 만드는 계정을 식별합니다.
graph('LDBC_Financial')
| graph-match (node)
project node_id = node.node_id,
node_labels = labels(node),
out_degree = node_degree_out(node)
| order by out_degree desc
| take 3
| node_id | 노드 레이블 | 아웃-디그리 |
|---|---|---|
| 계정::236720455413661980 | [<br> "ACCOUNT"<br>] |
384 |
| 계정::56576470318842045 | [<br> "ACCOUNT"<br>] |
106 |
| 계정::4890627720347648300 | [<br> "ACCOUNT"<br>] |
81 |
관계 패턴 분석
이러한 쿼리는 데이터의 중요한 동작 또는 변칙을 나타낼 수 있는 구조적 패턴 및 복잡한 관계를 식별하는 데 도움이 됩니다.
삼각형 관계 검색(삼각형에 연결된 노드):
삼각형 패턴은 종종 긴밀한 공동 작업, 상호 종속성 또는 폐쇄 루프 프로세스를 나타냅니다. 소셜 네트워크에서는 친구 그룹을 나타냅니다. 비즈니스 프로세스에서 승인 체인 또는 중복 패턴을 나타낼 수 있습니다. 이 예제에서는 그래프를 BloodHound_AD 사용하여 Active Directory 환경에서 순환 권한 관계를 식별합니다.
graph('BloodHound_AD')
| graph-match (a)-->(b)-->(c)-->(a)
where a.id != b.id and b.id != c.id and c.id != a.id
project node1 = a.name, node2 = b.name, node3 = c.name
| take 3
| node1 | node2 | node3 |
|---|---|---|
| GHOST.CORP | USERS@GHOST.CORP | 도메인 CONTROLLERS@GHOST.CORP |
| WRAITH.회사 | USERS@WRAITH.CORP | 도메인 CONTROLLERS@WRAITH.CORP |
| DU001@PHANTOM.CORP | ADMINISTRATORS@PHANTOM.CORP | 도메인 ADMINS@PHANTOM.CORP |
속성 분석
노드에서 사용할 수 있는 속성을 이해하면 보다 정교한 쿼리를 빌드하고 데이터 품질 문제를 식별할 수 있습니다.
노드 속성 탐색:
이 쿼리는 노드에 저장된 정보를 표시하여 필터링 및 분석에 사용할 수 있는 특성을 이해하는 데 도움이 됩니다. 이 예제에서는 그래프를 BloodHound_Entra 사용하여 AZUser 노드의 스키마를 탐색하고 Microsoft Entra 사용자 개체에 사용할 수 있는 속성을 이해합니다.
graph('BloodHound_Entra')
| graph-match (node)
where labels(node) has "AZUser" // Replace with actual label
project properties = node.properties
| mv-apply properties on (
mv-expand kind=array properties
| where isnotempty(properties[1])
| extend bag =bag_pack(tostring(properties[0]), properties[1])
| summarize properties = make_bag(bag)
)
| summarize buildschema(properties)
| 스키마_프로퍼티 (schema_properties) |
|---|
{<br> "onpremsyncenabled": "bool",<br> "system_tags": "string",<br> "lastcollected": "string",<br> "pwdlastset": "string",<br> "usertype": "string",<br> "userprincipalname": "string",<br> "email": "string",<br> "tenantid": "guid",<br> "name": "string",<br> "lastseen": "string",<br> "displayname": "string",<br> "enabled": "bool",<br> "title": "string",<br> "onpremid": "string",<br> "objectid": "guid",<br> "whencreated": "string"<br>} |
레이블별로 모든 노드의 속성을 찾습니다.
이 고급 스키마 검색 쿼리는 각 레이블 유형의 노드에 존재하는 모든 속성 이름을 식별합니다. 스키마 구조를 보여 주는 이전 쿼리와 달리 이 쿼리는 동일한 형식의 모든 노드에서 속성 이름을 집계하여 일관되게 사용할 수 있는 속성과 선택적 또는 드문 속성을 이해하는 데 도움이 됩니다. 이 예제에서는 그래프를 LDBC_SNB_Interactive 사용하여 소셜 네트워크 데이터 세트에서 다양한 엔터티 형식의 전체 속성 환경을 탐색합니다.
graph('LDBC_SNB_Interactive')
| graph-match (node)
project properties = node, labels = labels(node)
| mv-apply properties on (
mv-expand kind=array properties
| where isnotempty(properties[1])
| summarize properties = make_set(properties[0])
)
| mv-expand label = labels to typeof(string)
| summarize properties =make_set(properties) by label
| take 3
| label | properties |
|---|---|
| TAGCLASS | [<br> "id",<br> "node_id",<br> "lbl",<br> "name",<br> "url"<br>] |
| 태그 | [<br> "id",<br> "node_id",<br> "lbl",<br> "name",<br> "url"<br>] |
| 포럼 | [<br> "id",<br> "creationDate",<br> "node_id",<br> "lbl",<br> "title"<br>] |
레이블별로 모든 가장자리의 속성을 찾습니다.
이 쿼리는 에지(관계) 속성에 대한 스키마 검색을 수행하여 그래프의 각 관계 유형과 함께 저장된 정보를 보여 줍니다. 에지 속성을 이해하는 것은 타임스탬프, 가중치, 신뢰도 점수 또는 연결에 대한 컨텍스트를 제공하는 기타 특성과 같은 관계 메타데이터를 분석하는 데 중요합니다. 이 예제에서는 그래프를 BloodHound_AD 사용하여 다양한 유형의 Active Directory 권한 관계에서 사용할 수 있는 속성을 탐색합니다.
graph('BloodHound_AD')
| graph-match ()-[e]-()
project properties = e, labels = labels(e)
| mv-apply properties on (
mv-expand kind=array properties
| where isnotempty(properties[1])
| summarize properties = make_set(properties[0])
)
| mv-expand label = labels to typeof(string)
| summarize properties =make_set(properties) by label
| take 3
| label | properties |
|---|---|
| 모든변경사항가져오기 | [<br> "id",<br> "lbl",<br> "src",<br> "dst",<br> "properties",<br> "lastseen"<br>] |
| OwnsRaw | [<br> "id",<br> "lbl",<br> "src",<br> "dst",<br> "properties",<br> "lastseen"<br>] |
| AddKeyCredentialLink (키 자격 증명 링크 추가) | [<br> "id",<br> "lbl",<br> "src",<br> "dst",<br> "properties",<br> "lastseen"<br>] |
특정 속성 값이 있는 노드를 찾습니다.
이 패턴을 사용하여 특정 특성이 있는 엔터티를 찾거나 예상 속성 값을 확인하여 데이터 품질의 유효성을 검사할 수 있습니다. 이 예제에서는 그래프를 BloodHound_Entra 사용하여 Microsoft Entra 환경에서 특정 이름 속성이 있는 노드를 찾습니다.
graph('BloodHound_Entra')
| graph-match (node)
where isnotempty(node.properties.name)
project node_id = node.id, property_value = node.properties.name
| take 3
| node_id | 속성_값 |
|---|---|
| 1 | JJACOB@PHANTOMCORP.ONMICROSOFT.COM |
| 10 | CJACKSON@PHANTOMCORP.ONMICROSOFT.COM |
| 12 | RHALL@PHANTOMCORP.ONMICROSOFT.COM |
그래프의 토폴로지
그래프의 전체 토폴로지 이해는 서로 다른 엔터티 형식 간에 존재하는 연결 형식을 보여줍니다. 이 분석을 통해 데이터 모델을 이해하고, 가장 일반적인 관계 패턴을 식별하고, 순회 쿼리에 대한 잠재적 경로를 검색할 수 있습니다. 토폴로지 쿼리는 특정 에지 형식을 통해 다른 노드 레이블에 연결되는 노드 레이블을 보여 줍니다. 그래프의 구조를 포괄적으로 볼 수 있습니다.
//Topology of the graph - What's connected to what?
graph('LDBC_Financial')
| graph-match (src)-[e]->(dst)
project SourceLabels = labels(src), EdgeLabels = labels(e), DestinationLabels = labels(dst)
| mv-expand EdgeLabel = EdgeLabels to typeof(string)
| mv-expand SourceLabel = SourceLabels to typeof(string)
| mv-expand DestinationLabel = DestinationLabels to typeof(string)
| summarize Count = count() by SourceLabel, EdgeLabel, DestinationLabel
| 소스 레이블 | EdgeLabel | DestinationLabel | 수량 |
|---|---|---|---|
| 회사 | 보증 | 회사 | 202 |
| 회사 | APPLY | 대출 | 449 |
| 사람 | APPLY | 대출 | 927 |
| 계좌 | 갚다 | 대출 | 2747 |
| 대출 | 보증금 | 계좌 | 2758 |
| 계좌 | 전송하다 | 계좌 | 8132 |
| 계좌 | 물러서다 | 계좌 | 9182 |
| 사람 | 보증 | 사람 | 377 |
| 회사 | 소유하다 | 계좌 | 671 |
| 회사 | 투자하다 | 회사 | 679 |
| 사람 | 소유하다 | 계좌 | 1384 |
| 보통 | 로그인 | 계좌 | 2489 |
| 사람 | 투자하다 | 회사 | 1304 |