Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 |