그래프 일치 연산자
적용 대상: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
graph-match
연산자는 입력 그래프 원본에서 그래프 패턴의 모든 발생을 검색합니다.
메모
이 연산자는 make-graph 연산자함께 사용됩니다.
통사론
G|
graph-match
[cycles
=
CyclesOption] 패턴 [where
제약 조건] project
[ColumnName=
] 식 [,
...]
매개 변수
이름 | 형 | 필수 | 묘사 |
---|---|---|---|
G | string |
✔️ | 입력 그래프 원본입니다. |
패턴 | string |
✔️ | 그래프 표기법을 사용하여 그래프 에지 요소로 연결된 그래프 노드 요소의 하나 이상의 쉼표로 구분된 시퀀스입니다. 그래프 패턴 표기법참조하세요. |
제약 조건 | string |
Pattern명명된 변수의 속성으로 구성된 부울 식입니다. 각 그래프 요소(노드/에지)에는 그래프 생성 중에 연결된 속성 집합이 있습니다. 제약 조건은 패턴과 일치하는 요소(노드 및 가장자리)를 정의합니다. 속성은 변수 이름 뒤에 점(. ) 및 속성 이름으로 참조됩니다. |
|
식 | string |
✔️ |
project 절은 각 패턴을 테이블 형식 결과의 행으로 변환합니다. 프로젝트 식은 Pattern정의된 명명된 변수의 스칼라 및 참조 속성이어야 합니다. 속성은 변수 이름 뒤에 점(. ) 및 특성 이름으로 참조됩니다. |
CyclesOption | string |
패턴all , none , unique_edges 등 허용되는 값에서 주기가 일치하는지 여부를 제어합니다.
all 지정하면 모든 주기가 일치하며, none 지정된 주기가 일치하지 않는 경우 unique_edges (기본값)를 지정하면 주기가 일치하지만 주기에 동일한 가장자리가 두 번 이상 포함되지 않은 경우에만 일치합니다. |
그래프 패턴 표기법
다음 표에서는 지원되는 그래프 표기법을 보여줍니다.
요소 | 명명된 변수 | 익명의 |
---|---|---|
노드 |
(
n) |
() |
방향 가장자리: 왼쪽에서 오른쪽으로 |
-[
e]-> |
--> |
방향 가장자리: 오른쪽에서 왼쪽으로 |
<-[
e]- |
<-- |
모든 방향 가장자리 |
-[
e]- |
-- |
가변 길이 가장자리 |
-[
e*3..5]- |
-[*3..5]- |
가변 길이 가장자리
가변 길이 에지를 사용하면 정의된 제한 내에서 특정 패턴을 여러 번 반복할 수 있습니다. 이 유형의 에지는 별표(*
) 뒤에 최소 및 최대 발생 값이 최소..
최대표시됩니다. 최소값과 최대값은 모두 정수 스칼라여야 합니다. 시퀀스의 모든 가장자리가 where
절에 설명된 제약 조건을 충족하는 경우 이 발생 범위 내에 속하는 모든 가장자리 시퀀스는 패턴의 가변 가장자리와 일치할 수 있습니다.
여러 시퀀스
여러 쉼표로 구분된 시퀀스는 비선형 패턴을 표현하는 데 사용됩니다. 서로 다른 시퀀스 간의 연결을 설명하려면 노드의 하나 이상의 변수 이름을 공유해야 합니다. 예를 들면 다음과 같습니다. 별의 가운데에 노드 n 있고 노드에 연결된 별 패턴을 표현하려면b,c 및 d 다음 패턴을 사용할 수 있습니다.)--(
n)--(
b)
(
(
c)--(
n)--(
d)
. 연결된 단일 구성 요소 패턴만 지원됩니다.
반환
graph-match
연산자는 각 레코드가 그래프의 패턴 일치에 해당하는 테이블 형식 결과를 반환합니다.
반환된 열은 패턴에 정의된 에지 및/또는 노드의 속성을 사용하여 연산자의 project
절에 정의됩니다. 가변 길이 에지 속성의 속성과 함수는 동적 배열로 반환되며 배열의 각 값은 가변 길이 가장자리의 발생에 해당합니다.
예제
관리자 조직의 모든 직원
다음 예제에서는 조직 계층 구조를 나타내며, 단일 쿼리에서 다양한 계층 수준의 직원을 찾기 위해 가변 길이 에지를 사용하는 방법을 보여 줍니다. 그래프의 노드는 직원을 나타내고 에지는 직원에서 관리자로 구성됩니다.
make-graph
사용하여 그래프를 빌드한 후 Alice
조직에서 30
미만인 직원을 검색합니다.
쿼리 실행
let employees = datatable(name:string, age:long)
[
"Alice", 32,
"Bob", 31,
"Eve", 27,
"Joe", 29,
"Chris", 45,
"Alex", 35,
"Ben", 23,
"Richard", 39,
];
let reports = datatable(employee:string, manager:string)
[
"Bob", "Alice",
"Chris", "Alice",
"Eve", "Bob",
"Ben", "Chris",
"Joe", "Alice",
"Richard", "Bob"
];
reports
| make-graph employee --> manager with employees on name
| graph-match (alice)<-[reports*1..5]-(employee)
where alice.name == "Alice" and employee.age < 30
project employee = employee.name, age = employee.age, reportingPath = reports.manager
출력
종업원 | 연령 | reportingPath |
---|---|---|
조 | 29 | [ "Alice" ] |
이브 | 27 | [ "Alice", "Bob" ] |
벤 | 23 | [ "Alice", "Chris" ] |
공격 경로
다음 예제에서는 Actions
및 Entities
테이블에서 그래프를 작성합니다. 엔터티는 사람 및 시스템이며, 작업은 엔터티 간의 서로 다른 관계를 설명합니다. 그래프를 빌드하는 make-graph
연산자에 따라 "Apollo" 시스템에 대한 공격 경로를 검색하는 그래프 패턴으로 graph-match
호출됩니다.
쿼리 실행
let Entities = datatable(name:string, type:string, age:long)
[
"Alice", "Person", 23,
"Bob", "Person", 31,
"Eve", "Person", 17,
"Mallory", "Person", 29,
"Apollo", "System", 99
];
let Actions = datatable(source:string, destination:string, action_type:string)
[
"Alice", "Bob", "communicatesWith",
"Alice", "Apollo", "trusts",
"Bob", "Apollo", "hasPermission",
"Eve", "Alice", "attacks",
"Mallory", "Alice", "attacks",
"Mallory", "Bob", "attacks"
];
Actions
| make-graph source --> destination with Entities on name
| graph-match (mallory)-[attacks]->(compromised)-[hasPermission]->(apollo)
where mallory.name == "Mallory" and apollo.name == "Apollo" and attacks.action_type == "attacks" and hasPermission.action_type == "hasPermission"
project Attacker = mallory.name, Compromised = compromised.name, System = apollo.name
출력
공격자 | 손상 | 체계 |
---|---|---|
Mallory | 밥 | 아폴론 |
별 모양 패턴
다음 예제는 이전 공격 경로 예제와 비슷하지만 추가 제약 조건이 있습니다. 손상된 엔터티도 Alice통신하려고 합니다.
graph-match
패턴 접두사는 이전 예제와 동일하며 손상된 시퀀스 간의 링크로 추가 시퀀스를 추가합니다.
쿼리 실행
let Entities = datatable(name:string, type:string, age:long)
[
"Alice", "Person", 23,
"Bob", "Person", 31,
"Eve", "Person", 17,
"Mallory", "Person", 29,
"Apollo", "System", 99
];
let Actions = datatable(source:string, destination:string, action_type:string)
[
"Alice", "Bob", "communicatesWith",
"Alice", "Apollo", "trusts",
"Bob", "Apollo", "hasPermission",
"Eve", "Alice", "attacks",
"Mallory", "Alice", "attacks",
"Mallory", "Bob", "attacks"
];
Actions
| make-graph source --> destination with Entities on name
| graph-match (mallory)-[attacks]->(compromised)-[hasPermission]->(apollo), (compromised)-[communicates]-(alice)
where mallory.name == "Mallory" and apollo.name == "Apollo" and attacks.action_type == "attacks" and hasPermission.action_type == "hasPermission" and alice.name == "Alice"
project Attacker = mallory.name, Compromised = compromised.name, System = apollo.name
출력
공격자 | 손상 | 체계 |
---|---|---|
Mallory | 밥 | 아폴론 |
관련 콘텐츠
- 그래프 연산자
- make-graph 연산자