그래프 탐색 기본 사항

버전 드롭다운 목록을 사용하여 서비스를 전환합니다. 탐색에 대해 자세히 알아봅니다.
적용 대상: ✅ 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