Udostępnij przez


Podstawy eksploracji grafu

Dotyczy: ✅Microsoft Fabric✅Azure Data Explorer

Ta strona zawiera wzorce języka KQL (Reusable Kusto Query Language) umożliwiające szybkie eksplorowanie zestawów danych grafu i odpowiadanie na typowe pytania dotyczące struktury, węzłów, krawędzi i właściwości.

Wskazówka

Szukasz wskazówek dotyczących projektowania i wydajności? Zobacz Najlepsze rozwiązania dotyczące semantyki grafu.

Typowe zapytania analizy

Te wzorce zapytań wielokrotnego użytku działają we wszystkich modelach grafów i pomagają zrozumieć strukturę i charakterystykę dowolnego zestawu danych grafu. W poniższym przykładzie użyto przykładowych wykresów dostępnych w naszym klastrze pomocy w bazie danych Przykłady . Aby uzyskać szczegółowe informacje na temat tych wykresów, zobacz Przykładowe zestawy danych i przykłady programu Graph. Użyj tych zapytań, aby eksplorować nowe grafy, wykonywać podstawowe analizy lub jako punkty wyjścia dla bardziej złożonych badań grafów.

Omówienie wykresu i statystyki

Zrozumienie podstawowych cech grafu jest niezbędne do planowania analizy i optymalizacji wydajności. Te zapytania udostępniają podstawowe metryki dotyczące rozmiaru i struktury grafu.

Zlicz łączną liczbę węzłów i krawędzi:

Użyj tych zapytań, aby zrozumieć skalę zestawu danych grafu. Liczniki węzłów i krawędzi pomagają określić odpowiednie strategie zapytań i zidentyfikować potencjalne zagadnienia dotyczące wydajności. W tych przykładach użyto Simple grafu, który jest idealny do uczenia się podstawowych operacji grafu.

// Get node count
graph('Simple')
| graph-match (node)
    project node
| count
Liczba
11
// Get edge count
graph('Simple')
| graph-match (source)-[edge]->(target)
    project edge
| count
Liczba
20

Pobierz statystyki podsumowania grafu:

To połączone zapytanie wydajnie zapewnia zarówno metryki w jednym wyniku, co jest przydatne do początkowej oceny grafu i raportowania. W tym przykładzie przedstawiono technikę Simple przy użyciu grafu.

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
Element programu Graph Liczba
nodes 11
Krawędzie 20

Alternatywa przy użyciu wykresu do tabeli:

W przypadku zliczania podstawowego graph-to-table operator może być bardziej wydajny, ponieważ bezpośrednio eksportuje elementy grafu bez dopasowywania wzorców. W tym przykładzie przedstawiono alternatywne podejście przy użyciu tego samego Simple grafu.

let nodes = view() { graph('Simple') | graph-to-table nodes | count };
let edges = view() { graph('Simple') | graph-to-table edges | count };
union nodes, edges
Liczba
11
20

Analiza węzła

Analiza węzła pomaga zrozumieć jednostki na grafie, ich typy i dystrybucję. Te wzorce są niezbędne do oceny jakości danych i zrozumienia schematu.

Odnajdź wszystkie typy węzłów (etykiety)::

To zapytanie ujawnia różne typy jednostek na grafie i ich częstotliwości. Użyj go, aby zrozumieć model danych, zidentyfikować najbardziej typowe typy jednostek i wykryć potencjalne problemy z jakością danych. W tym przykładzie użyto grafu zawierającego Simplejednostki Person, Company i 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
etykieta hrabia_
Osoba 5
Firma 3
Miejscowość 3

Znajdź węzły z wieloma etykietami:

Identyfikuje węzły należące jednocześnie do wielu kategorii. Jest to przydatne do zrozumienia nakładających się klasyfikacji i złożonych relacji jednostek w modelu danych. W tym przykładzie użyto grafu zawierającego BloodHound_Entraobiekty Firmy Microsoft Entra z wieloma klasyfikacjami etykiet.

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 label_count
2 [
"AZBase",
"AZServicePrincipal"
]
2
4 [
"AZBase",
"AZUser"
]
2
5 [
"AZBase",
"AZUser"
]
2

Przykładowe węzły według typu:

Pobiera reprezentatywne przykłady określonych typów węzłów, aby zrozumieć ich strukturę i właściwości. Niezbędne do eksploracji danych i tworzenia zapytań. W tym przykładzie użytoBloodHound_Entra grafu do eksplorowania właściwości węzła AZUser w środowiskach Firmy Microsoft Entra.

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 {
"lastseen": "2025-08-11T09:21:19.002Z[UTC]",
"lastcollected": "2025-08-11T09:21:07.472380514Z[UTC]",
"enabled": true,
"displayname": "Jack Miller",
"name": "JMILLER@PHANTOMCORP.ONMICROSOFT.COM",
"tenantid": "6c12b0b0-b2cc-4a73-8252-0b94bfca2145",
"objectid": "9a20c327-8cc7-4425-9480-11fb734db194",
"onpremid": "",
"usertype": "Member",
"title": "",
"userprincipalname": "jmiller@phantomcorp.onmicrosoft.com",
"system_tags": "admin_tier_0",
"pwdlastset": "2021-06-16T17:51:03Z[UTC]",
"onpremsyncenabled": false,
"whencreated": "2021-06-16T17:29:16Z[UTC]",
"email": ""
}
10 {
"lastseen": "2025-08-11T09:21:07.472380514Z[UTC]",
"onpremid": "",
"usertype": "Member",
"title": "",
"lastcollected": "2025-08-11T09:21:07.472380514Z[UTC]",
"enabled": true,
"userprincipalname": "cjackson@phantomcorp.onmicrosoft.com",
"system_tags": "admin_tier_0",
"displayname": "Chris Jackson",
"pwdlastset": "2022-07-19T15:18:49Z[UTC]",
"onpremsyncenabled": false,
"name": "CJACKSON@PHANTOMCORP.ONMICROSOFT.COM",
"tenantid": "6c12b0b0-b2cc-4a73-8252-0b94bfca2145",
"whencreated": "2022-07-19T15:01:55Z[UTC]",
"email": "cjackson@phantomcorp.onmicrosoft.com",
"objectid": "bfb6a9c2-f3c8-4b9c-9d09-2924d38895f7"
}

Analiza krawędzi

Zrozumienie relacji na grafie ma kluczowe znaczenie dla identyfikowania wzorców, problemów z jakością danych i potencjalnych wskazówek analizy.

Odnajdź wszystkie typy krawędzi (działa z różnymi schematami grafu):

To zapytanie identyfikuje wszystkie typy relacji na grafie, pomagając zrozumieć połączenia dostępne do analizy. Różne grafy używają różnych nazw właściwości dla typów krawędzi, więc podano wiele odmian. W tym przykładzie użytoBloodHound_Entra grafu w celu wyświetlenia relacji uprawnień w środowiskach firmy 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
etykieta hrabia_
AZMGAddOwner 403412
AZMGAddSecret 345324
AzAddSecret 24666
AzContains 12924
AzRunsAs 6269

Znajdź większość połączonych węzłów (najwyższy stopień):

Analiza stopnia węzła ujawnia najbardziej wpływowe lub centralne jednostki na wykresie. Węzły wysokiego stopnia często reprezentują kluczowe elementy, wąskie gardła lub ważne składniki infrastruktury. W tym przykładzie użyto grafu , zestawu danych sieci społecznościowych idealnego LDBC_SNB_Interactivedo analizowania wzorców połączeń i wpływu.

// 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 in_degree out_degree total_degree
0 41076 1 41077
1 35169 1 35170
50 12080 1 12081
49 11554 1 11555
58 7571 1 7572

Znajdź węzły o najwyższym stopniu (większość połączeń przychodzących)::

Węzły o wysokim stopniu są często obiektami docelowymi wpływu, popularnymi miejscami docelowymi lub zasobami centralnymi. W sieciach społecznościowych mogą to być wpływowe osoby; w grafach infrastruktury mogą to być usługi krytyczne. W tym przykładzie użytoLDBC_Financial grafu, aby zidentyfikować konta odbierające najwięcej transakcji.

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 node_labels in_degree
Account::99079191802151398 [
"KONTO"
]
314
Account::4868391197187506662 [
"KONTO"
]
279
Account::4896538694858573544 [
"KONTO"
]
184

Znajdź węzły o najwyższym poziomie wychodzącym (większość połączeń wychodzących)::

Węzły wysokiego poziomu są często źródłami wpływu, dystrybutorów lub koncentratorów łączników. Te jednostki zazwyczaj inicjują wiele relacji lub dystrybuują zasoby do innych. W tym przykładzie użyto LDBC_Financial grafu , aby zidentyfikować konta, które najwięcej transakcji.

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 node_labels out_degree
Account::236720455413661980 [
"KONTO"
]
384
Account::56576470318842045 [
"KONTO"
]
106
Account::4890627720347648300 [
"KONTO"
]
81

Analiza wzorca relacji

Te zapytania ułatwiają identyfikowanie wzorców strukturalnych i złożonych relacji, które mogą wskazywać na ważne zachowania lub anomalie w danych.

Odnajdź relacje trójkątne (węzły połączone w trójkącie):

Trójkątne wzorce często wskazują na ścisłą współpracę, wzajemne zależności lub procesy zamkniętej pętli. W sieciach społecznościowych reprezentują one grupy przyjaciół; w procesach biznesowych mogą wskazywać łańcuchy zatwierdzania lub wzorce nadmiarowości. W tym przykładzie użytoBloodHound_AD grafu do identyfikowania relacji uprawnień cyklicznych w środowiskach usługi 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
DUCH. CORP USERS@GHOST.CORP DOMENA CONTROLLERS@GHOST.CORP
WRAITH. CORP USERS@WRAITH.CORP DOMENA CONTROLLERS@WRAITH.CORP
DU001@PHANTOM.CORP ADMINISTRATORS@PHANTOM.CORP DOMENA ADMINS@PHANTOM.CORP

Analiza właściwości

Zrozumienie właściwości dostępnych w węzłach ułatwia tworzenie bardziej zaawansowanych zapytań i identyfikowanie problemów z jakością danych.

Eksplorowanie właściwości węzła:

To zapytanie ujawnia informacje przechowywane w węzłach, pomagając zrozumieć dostępne atrybuty do filtrowania i analizy. W tym przykładzie użytoBloodHound_Entra grafu do eksplorowania schematu węzłów AZUser i zrozumienia, jakie właściwości są dostępne dla obiektów użytkownika firmy 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
{
"onpremsyncenabled": "bool",
"system_tags": "string",
"lastcollected": "string",
"pwdlastset": "string",
"usertype": "string",
"userprincipalname": "string",
"email": "string",
"tenantid": "guid",
"name": "string",
"lastseen": "string",
"displayname": "string",
"enabled": "bool",
"title": "string",
"onpremid": "string",
"objectid": "guid",
"whencreated": "string"
}

Znajdź wszystkie właściwości wszystkich węzłów według etykiety:

To zaawansowane zapytanie odnajdywania schematu identyfikuje wszystkie nazwy właściwości, które istnieją w węzłach każdego typu etykiety. W przeciwieństwie do poprzedniego zapytania, które pokazuje strukturę schematu, to zapytanie agreguje nazwy właściwości we wszystkich węzłach tego samego typu, co pomaga zrozumieć, które właściwości są stale dostępne i które mogą być opcjonalne lub rzadkie. W tym przykładzie użyto grafu do eksplorowania pełnego krajobrazu LDBC_SNB_Interactive właściwości różnych typów jednostek w zestawie danych sieci społecznościowych.

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
etykieta properties
TAGCLASS [
"id",
"node_id",
"lbl",
"name",
"url"
]
ZNACZNIK [
"id",
"node_id",
"lbl",
"name",
"url"
]
FORUM [
"id",
"creationDate",
"node_id",
"lbl",
"title"
]

Znajdź wszystkie właściwości wszystkich krawędzi według etykiety:

To zapytanie wykonuje odnajdywanie schematu dla właściwości krawędzi (relacji), pokazując, jakie informacje są przechowywane z każdym typem relacji na grafie. Zrozumienie właściwości krawędzi ma kluczowe znaczenie dla analizowania metadanych relacji, takich jak znaczniki czasu, wagi, wyniki ufności lub inne atrybuty, które zapewniają kontekst połączeń. W tym przykładzie użytoBloodHound_AD grafu do eksplorowania właściwości dostępnych w różnych typach relacji uprawnień usługi 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
etykieta properties
GetChangesAll [
"id",
"lbl",
"src",
"dst",
"properties",
"lastseen"
]
WłaścicieleRaw [
"id",
"lbl",
"src",
"dst",
"properties",
"lastseen"
]
AddKeyCredentialLink [
"id",
"lbl",
"src",
"dst",
"properties",
"lastseen"
]

Znajdź węzły z określonymi wartościami właściwości:

Użyj tego wzorca, aby zlokalizować jednostki o określonych cechach lub zweryfikować jakość danych, sprawdzając oczekiwane wartości właściwości. W tym przykładzie użyto grafu w celu znalezieniaBloodHound_Entra węzłów o określonych właściwościach nazw w środowiskach firmy 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 property_value
1 JJACOB@PHANTOMCORP.ONMICROSOFT.COM
10 CJACKSON@PHANTOMCORP.ONMICROSOFT.COM
12 RHALL@PHANTOMCORP.ONMICROSOFT.COM

Topologia grafu

Zrozumienie ogólnej topologii grafu ujawnia typy połączeń, które istnieją między różnymi typami jednostek. Ta analiza pomaga zrozumieć model danych, zidentyfikować najczęstsze wzorce relacji i odnaleźć potencjalne ścieżki dla zapytań przechodzenia. Zapytanie topologii pokazuje, które etykiety węzłów łączą się z innymi etykietami węzłów za pośrednictwem określonych typów krawędzi, zapewniając kompleksowy widok struktury grafu.

//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
Etykieta źródłowa Etykieta krawędzi DestinationLabel Liczba
FIRMA GWARANCJA FIRMA 202
FIRMA APPLY POŻYCZKA 449
OSOBA APPLY POŻYCZKA 927
RACHUNEK SPŁATY POŻYCZKA 2747
POŻYCZKA WPŁATA RACHUNEK 2758
RACHUNEK PRZELAĆ RACHUNEK 8132
RACHUNEK WYCOFAĆ RACHUNEK 9182
OSOBA GWARANCJA OSOBA 377
FIRMA POSIADAĆ RACHUNEK 671
FIRMA INWESTOWAĆ FIRMA 679
OSOBA POSIADAĆ RACHUNEK 1384
ŚREDNI SIGN_IN RACHUNEK 2489
OSOBA INWESTOWAĆ FIRMA 1304