Jaké jsou běžné scénáře použití sémantiky grafu dotazovací jazyk Kusto (KQL)?
Sémantika grafu v dotazovací jazyk Kusto (KQL) umožňuje modelovat a dotazovat data jako grafy. Grafy jsou užitečné pro reprezentaci složitých a dynamických dat, které zahrnují vztahy M:N, hierarchické nebo síťové vztahy, jako jsou sociální sítě, systémy doporučení, propojené prostředky nebo grafy znalostí.
V tomto článku se dozvíte o následujících běžných scénářích použití sémantiky grafů KQL:
Přátelé přítele
Jedním zběžnýchch Představte si například, že máme tabulku s názvem Uživatelé , která obsahuje data o uživatelích, jako je jejich jméno a organizace, a tabulka s názvem Ví , že obsahuje data o přátelství mezi uživateli, jak je znázorněno v následujícím diagramu:
Bez použití sémantiky grafu v KQL můžete vytvořit graf, který najde přátele přítele pomocí několika spojení, takto:
let Users = datatable (UserId: string, name: string, org: string)[]; // nodes
let Knows = datatable (FirstUser: string, SecondUser: string)[]; // edges
Users
| where org == "Contoso"
| join kind=inner (Knows) on $left.UserId == $right.FirstUser
| join kind=innerunique(Users) on $left.SecondUser == $right.UserId
| join kind=inner (Knows) on $left.SecondUser == $right.FirstUser
| join kind=innerunique(Users) on $left.SecondUser1 == $right.UserId
| where UserId != UserId1
| project name, name1, name2
Sémantika grafu v KQL umožňuje provádět stejný dotaz intuitivnějším a efektivnějším způsobem. Následující dotaz pomocí operátoru make-graph vytvoří směrovaný graf z FirstUser na SecondUser a rozšiřuje vlastnosti na uzlech pomocí sloupců poskytovaných tabulkou Users. Jakmile se vytvoří instance grafu, operátor shody grafu poskytuje model spřáteli-a-přítel, včetně filtrů a projekce, která vede k tabulkovému výstupu.
let Users = datatable (UserId:string , name:string , org:string)[]; // nodes
let Knows = datatable (FirstUser:string , SecondUser:string)[]; // edges
Knows
| make-graph FirstUser --> SecondUser with Users on UserId
| graph-match (user)-->(middle_man)-->(friendOfAFriend)
where user.org == "Contoso" and user.UserId != friendOfAFriend.UserId
project contoso_person = user.name, middle_man = middle_man.name, kusto_friend_of_friend = friendOfAFriend.name
Přehledy z dat protokolu
V některýchpřípadechch Data v každém řádku jsou řetězec, který obsahuje nezpracovaná data. Pokud chcete vytvořit graf z těchto dat, musíte nejprve identifikovat entity a relace, které jsou relevantní pro analýzu grafu. Předpokládejme například, že máte tabulku s názvem rawLogs z webového serveru, která obsahuje informace o požadavcích, jako je časové razítko, zdrojová IP adresa, cílový prostředek a mnoho dalšího.
Následující tabulka ukazuje příklad nezpracovaných dat:
let rawLogs = datatable (rawLog: string) [
"31.56.96.51 - - [2019-01-22 03:54:16 +0330] \"GET /product/27 HTTP/1.1\" 200 5379 \"https://www.contoso.com/m/filter/b113\" \"some client\" \"-\"",
"31.56.96.51 - - [2019-01-22 03:55:17 +0330] \"GET /product/42 HTTP/1.1\" 200 5667 \"https://www.contoso.com/m/filter/b113\" \"some client\" \"-\"",
"54.36.149.41 - - [2019-01-22 03:56:14 +0330] \"GET /product/27 HTTP/1.1\" 200 30577 \"-\" \"some client\" \"-\""
];
Jedním ze způsobů, jak modelovat graf z této tabulky, je považovat zdrojové IP adresy za uzly a webové požadavky na prostředky jako hrany. Operátor analýzy můžete použít k extrahování sloupců, které potřebujete pro graf, a pak můžete vytvořit graf, který představuje síťový provoz a interakce mezi různými zdroji a cíli. K vytvoření grafu můžete použít operátor make-graph určující zdrojové a cílové sloupce jako hraniční koncové body a volitelně zadat další sloupce jako hrany nebo vlastnosti uzlu.
Následující dotaz vytvoří graf z nezpracovaných protokolů:
let parsedLogs = rawLogs
| parse rawLog with ipAddress: string " - - [" timestamp: datetime "] \"" httpVerb: string " " resource: string " " *
| project-away rawLog;
let edges = parsedLogs;
let nodes =
union
(parsedLogs
| distinct ipAddress
| project nodeId = ipAddress, label = "IP address"),
(parsedLogs | distinct resource | project nodeId = resource, label = "resource");
let graph = edges
| make-graph ipAddress --> resource with nodes on nodeId;
Tento dotaz analyzuje nezpracované protokoly a vytvoří směrovaný graf, ve kterém jsou uzly BUĎ IP adresy nebo prostředky, a každý okraj je požadavek ze zdroje do cíle s časovým razítkem a příkazem HTTP jako vlastnostmi hraničních zařízení.
Po vytvoření grafu můžete pomocí operátoru shody grafu dotazovat data grafu pomocí vzorů, filtrů a projekcí. Můžete například vytvořit vzor, který vytvoří jednoduché doporučení na základě prostředků, které během posledních pěti minut požadovaly jiné IP adresy, následujícím způsobem:
graph
| graph-match (startIp)-[request]->(resource)<--(otherIP)-[otherRequest]->(otherResource)
where startIp.label == "IP address" and //start with an IP address
resource.nodeId != otherResource.nodeId and //recommending a different resource
startIp.nodeId != otherIP.nodeId and //only other IP addresses are interesting
(request.timestamp - otherRequest.timestamp < 5m) //filter on recommendations based on the last 5 minutes
project Recommendation=otherResource.nodeId
Výstup
Doporučení |
---|
/product/42 |
Dotaz vrátí hodnotu /product/42 jako doporučení na základě nezpracovaného textového protokolu.
Související obsah
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro