KQL(Kusto 쿼리 언어) 그래프 의미 체계를 사용하는 일반적인 시나리오는 무엇인가요?
KQL(Kusto 쿼리 언어 그래프 의미 체계)을 사용하면 데이터를 그래프로 모델링하고 쿼리할 수 있습니다. 그래프가 소셜 네트워크, 추천 시스템, 연결된 자산 또는 지식 그래프와 같은 다대다, 계층 또는 네트워크 관계를 포함하는 복잡하고 동적 데이터를 나타내는 데 유용한 많은 시나리오가 있습니다.
이 문서에서는 KQL 그래프 의미 체계를 사용하는 다음과 같은 일반적인 시나리오에 대해 알아봅니다.
친구의 친구
그래프의 일반적인 사용 사례 중 하나는 노드가 사용자이고 에지가 우정 또는 상호 작용인 소셜 네트워크를 모델링하고 쿼리하는 것입니다. 예를 들어 사용자 이름 및 조직과 같은 사용자에 대한 데이터가 있는 사용자라는 테이블과 다음 다이어그램과 같이 사용자 간의 우정에 대한 데이터가 있는 Knows라는 테이블이 있다고 상상해 보십시오.
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로의 지시된 그래프를 만들고 사용자 테이블에서 제공하는 열을 사용하여 노드의 속성을 보강합니다. 그래프가 인스턴스화 되면 그래프 일치 연산 자는 필터 및 테이블 형식 출력을 생성하는 프로젝션을 포함하여 friend-of-a-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
로그 데이터의 인사이트
일부 사용 사례에서는 로그 데이터와 같은 시계열 정보를 포함하는 간단한 플랫 테이블에서 인사이트를 얻고자 합니다. 각 행의 데이터는 원시 데이터를 포함하는 문자열입니다. 이 데이터에서 그래프를 만들려면 먼저 그래프 분석과 관련된 엔터티 및 관계를 식별해야 합니다. 예를 들어 타임스탬프, 원본 IP 주소, 대상 리소스 등과 같은 요청에 대한 정보가 포함된 웹 서버의 rawLogs라는 테이블이 있다고 가정합니다.
다음 표에서는 원시 데이터의 예를 보여줍니다.
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 주소를 노드로 처리하고 리소스에 대한 웹 요청을 에지로 처리하는 것입니다. 구문 분석 연산자를 사용하여 그래프에 필요한 열을 추출한 다음 네트워크 트래픽과 서로 다른 원본과 대상 간의 상호 작용을 나타내는 그래프를 만들 수 있습니다. 그래프를 만들려면 원본 및 대상 열을 에지 엔드포인트로 지정하고 필요에 따라 추가 열을 에지 또는 노드 속성으로 제공하는 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 주소가 지난 5분 이내에 요청한 리소스를 기반으로 간단한 권장 사항을 만드는 패턴을 만들 수 있습니다.
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"를 반환합니다.