Sdílet prostřednictvím


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 , že obsahuje data o přátelství mezi uživateli, jak je znázorněno v následujícím diagramu:

Diagram znázorňující graf přátel přítele

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í.

Diagram znázorňující graf analyzovaných dat protokolu

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.