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