Udostępnij za pośrednictwem


Jakie są typowe scenariusze korzystania z semantyki grafu język zapytań Kusto (KQL)?

Semantyka grafu w języku język zapytań Kusto (KQL) umożliwia modelowanie i wykonywanie zapytań o dane jako grafy. Istnieje wiele scenariuszy, w których wykresy są przydatne do reprezentowania złożonych i dynamicznych danych obejmujących relacje wiele do wielu, hierarchicznych lub sieciowych, takich jak sieci społecznościowe, systemy rekomendacji, połączone zasoby lub wykresy wiedzy.

W tym artykule przedstawiono następujące typowe scenariusze korzystania z semantyki grafu KQL:

Przyjaciele przyjaciela

Jednym z typowych przypadków użycia wykresów jest modelowanie i wykonywanie zapytań dotyczących sieci społecznościowych, gdzie węzły to użytkownicy i krawędzie to przyjaźnie lub interakcje. Załóżmy na przykład, że mamy tabelę o nazwie Użytkownicy zawierającą dane o użytkownikach, takie jak ich nazwa i organizacja, oraz tabelę o nazwie Wie , która zawiera dane dotyczące przyjaźni między użytkownikami, jak pokazano na poniższym diagramie:

Diagram przedstawiający wykres znajomych znajomego.

Bez używania semantyki grafu w języku KQL można utworzyć wykres, aby znaleźć znajomych znajomego przy użyciu wielu sprzężeń w następujący sposób:

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

Semantyka grafu w języku KQL umożliwia wykonywanie tego samego zapytania w bardziej intuicyjny i wydajny sposób. Poniższe zapytanie używa operatora make-graph do utworzenia skierowanego grafu z FirstUser do SecondUser i wzbogaca właściwości węzłów przy użyciu kolumn dostarczonych przez tabelę Users. Po utworzeniu wystąpienia grafu operator dopasowania grafu udostępnia wzorzec znajomego, w tym filtry i projekcję, która powoduje wyświetlenie danych wyjściowych tabelarycznych.

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

Szczegółowe informacje z danych dziennika

W niektórych przypadkach użycia chcesz uzyskać szczegółowe informacje z prostej tabeli płaskiej zawierającej informacje o szeregach czasowych, takich jak dane dziennika. Dane w każdym wierszu są ciągiem zawierającym dane pierwotne. Aby utworzyć graf na podstawie tych danych, należy najpierw zidentyfikować jednostki i relacje, które są istotne dla analizy grafu. Załóżmy na przykład, że masz tabelę o nazwie rawLogs z serwera internetowego, która zawiera informacje o żądaniach, takie jak sygnatura czasowa, źródłowy adres IP, zasób docelowy i wiele innych.

W poniższej tabeli przedstawiono przykład danych pierwotnych:

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

Jednym z możliwych sposobów modelowania grafu z tej tabeli jest traktowanie źródłowych adresów IP jako węzłów i żądań internetowych do zasobów jako krawędzi. Możesz użyć operatora analizy, aby wyodrębnić potrzebne kolumny dla grafu, a następnie utworzyć wykres reprezentujący ruch sieciowy i interakcje między różnymi źródłami i miejscami docelowymi. Aby utworzyć graf, możesz użyć operatora make-graph określającego kolumny źródłowe i docelowe jako punkty końcowe krawędzi i opcjonalnie podając dodatkowe kolumny jako właściwości krawędzi lub węzła.

Następujące zapytanie tworzy graf z nieprzetworzonych dzienników:

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;

To zapytanie analizuje nieprzetworzone dzienniki i tworzy skierowany graf, w którym węzły są adresami IP lub zasobami, a każda krawędź jest żądaniem ze źródła do miejsca docelowego z sygnaturą czasową i czasownikiem HTTP jako właściwościami krawędzi.

Diagram przedstawiający wykres analizowanych danych dziennika.

Po utworzeniu grafu możesz użyć operatora dopasowania grafu do wykonywania zapytań względem danych grafu przy użyciu wzorców, filtrów i projekcji. Na przykład można utworzyć wzorzec, który tworzy proste zalecenie na podstawie zasobów, które inne adresy IP żądane w ciągu ostatnich pięciu minut, w następujący sposób:

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

Wyjście

Zalecenie
/product/42

Zapytanie zwraca wartość "/product/42" jako zalecenie na podstawie nieprzetworzonego dziennika tekstowego.