共用方式為


使用 Kusto 查詢語言 (KQL) 圖表語意的常見案例有哪些?

Kusto 查詢語言 (KQL) 中的圖表語意可讓您將數據模型化和查詢為圖形。 有許多案例顯示圖表適用於代表涉及多對多、階層式或網路關聯性的複雜動態數據,例如社交網路、建議系統、連線資產或知識圖表。

在本文中,您將瞭解下列使用 KQL 圖形語意的常見案例:

朋友的朋友

圖形的其中一個常見使用案例是建立和查詢社交網路,其中節點是使用者,邊緣是友誼或互動。 例如,假設我們有一個名為Users的數據表,其具有使用者的相關數據,例如其名稱和組織,以及名為[知道] 的數據表,其中包含使用者之間友誼的相關數據,如下圖所示:

顯示朋友朋友圖表的圖表。

若不使用 KQL 中的圖表語意,您可以使用多個聯結建立圖形來尋找朋友的朋友,如下所示:

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

您可以使用 KQL 中的圖表語意,以更直覺且更有效率的方式執行相同的查詢。 下列查詢會使用 make-graph 運算符,建立從 FirstUser 到 SecondUser 的導向圖表,並使用 Users 數據表所提供的數據行擴充節點上的屬性。 圖形具現化后, 圖形比對運算符 會提供friend-of-friend模式,包括篩選和產生表格式輸出的投影。

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

來自記錄數據的深入解析

在某些使用案例中,您想要從包含時間序列信息的簡單一般數據表取得見解,例如記錄數據。 每個數據列中的數據都是包含原始數據的字串。 若要從此數據建立圖表,您必須先識別與圖表分析相關的實體和關聯性。 例如,假設您有一個名為 rawLogs 的數據表,其中包含有關要求的資訊,例如時間戳、來源 IP 位址、目的地資源等等。

下表顯示原始資料的範例:

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

從此數據表建立圖形模型的方法之一,就是將來源IP位址視為節點,以及將資源Web要求視為邊緣。 您可以使用 剖析運算符 來擷取圖形所需的數據行,然後您可以建立圖表,代表不同來源和目的地之間的網路流量和互動。 若要建立圖形,您可以使用 make-graph運算元 ,將來源和目的地數據行指定為邊緣端點,並選擇性地提供其他數據行做為邊緣或節點屬性。

下列查詢會從原始記錄建立圖形:

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;

此查詢會剖析原始記錄,並建立導向圖表,其中節點是IP位址或資源,而每個邊緣都是來源到目的地的要求,時間戳和 HTTP 動詞作為邊緣屬性。

顯示已剖析記錄數據的圖表。

建立圖形之後,您可以使用 圖表比對運算符 ,使用模式、篩選和投影來查詢圖形數據。 例如,您可以建立一種模式,根據過去五分鐘內要求的其他IP位址資源,提供簡單的建議,如下所示:

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

輸出

建議
/product/42

此查詢會根據原始文字型記錄傳回 「/product/42」 作為建議。