Condividi tramite


Quali sono gli scenari comuni per l'uso della semantica del grafo Linguaggio di query Kusto (KQL)

La semantica del grafo in Linguaggio di query Kusto (KQL) consente di modellare ed eseguire query sui dati come grafici. Esistono molti scenari in cui i grafici sono utili per rappresentare dati complessi e dinamici che coinvolgono relazioni molti-a-molti, gerarchiche o di rete, ad esempio social network, sistemi di raccomandazione, asset connessi o grafici delle conoscenze.

In questo articolo vengono illustrati gli scenari comuni seguenti per l'uso della semantica del grafo KQL:

Amici di un amico

Un caso d'uso comune per i grafici consiste nel modellare ed eseguire query sui social network, in cui i nodi sono utenti e archi sono amicizie o interazioni. Si supponga, ad esempio, di avere una tabella denominata Users che contiene dati sugli utenti, ad esempio il nome e l'organizzazione, e una tabella denominata Conosce i dati relativi alle amicizie tra gli utenti, come illustrato nel diagramma seguente:

Diagramma che mostra un grafico di amici di un amico.

Senza usare la semantica del grafo in KQL, è possibile creare un grafico per trovare amici di un amico usando più join, come indicato di seguito:

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

È possibile usare la semantica del grafo in KQL per eseguire la stessa query in modo più intuitivo ed efficiente. La query seguente usa l'operatore make-graph per creare un grafico diretto da FirstUser a SecondUser e arricchisce le proprietà nei nodi con le colonne fornite dalla tabella Users. Dopo aver creato un'istanza del grafico, l'operatore graph-match fornisce il modello friend-of-a-friend, inclusi i filtri e una proiezione che restituisce un output tabulare.

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

Informazioni dettagliate dai dati di log

In alcuni casi d'uso si vogliono ottenere informazioni dettagliate da una semplice tabella flat contenente informazioni sulle serie temporali, ad esempio i dati di log. I dati in ogni riga sono una stringa che contiene dati non elaborati. Per creare un grafico da questi dati, è necessario innanzitutto identificare le entità e le relazioni rilevanti per l'analisi del grafo. Si supponga, ad esempio, di avere una tabella denominata rawLogs da un server Web che contiene informazioni sulle richieste, ad esempio il timestamp, l'indirizzo IP di origine, la risorsa di destinazione e molto altro ancora.

La tabella seguente illustra un esempio di dati non elaborati:

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\" \"-\""
];

Un modo possibile per modellare un grafico da questa tabella consiste nel considerare gli indirizzi IP di origine come nodi e le richieste Web alle risorse come archi. È possibile usare l'operatore parse per estrarre le colonne necessarie per il grafico e quindi creare un grafico che rappresenta il traffico di rete e le interazioni tra origini e destinazioni diverse. Per creare il grafico, è possibile usare l'operatore make-graph specificando le colonne di origine e di destinazione come endpoint perimetrali e, facoltativamente, fornendo colonne aggiuntive come proprietà del bordo o del nodo.

La query seguente crea un grafico dai log non elaborati:

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;

Questa query analizza i log non elaborati e crea un grafico diretto in cui i nodi sono indirizzi IP o risorse e ogni arco è una richiesta dall'origine alla destinazione, con il timestamp e il verbo HTTP come proprietà perimetrali.

Diagramma che mostra un grafico dei dati di log analizzati.

Dopo aver creato il grafico, è possibile usare l'operatore graph-match per eseguire query sui dati del grafo usando modelli, filtri e proiezioni. Ad esempio, è possibile creare un modello che rende una raccomandazione semplice in base alle risorse richieste da altri indirizzi IP negli ultimi cinque minuti, come indicato di seguito:

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

Output

Elemento consigliato
/product/42

La query restituisce "/product/42" come raccomandazione in base a un log basato su testo non elaborato.