적용 대상: ✅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 절에 설명된 제약 조건을 충족하는 경우 이 발생 범위 내에 속하는 모든 가장자리 시퀀스는 패턴의 가변 가장자리와 일치할 수 있습니다.
여러 시퀀스
여러 쉼표로 구분된 시퀀스는 비선형 패턴을 표현하는 데 사용됩니다. 서로 다른 시퀀스 간의 연결을 설명하려면 노드의 하나 이상의 변수 이름을 공유해야 합니다. 예를 들어 노드 a, b, c 및 d에 연결된 가운데에 노드 n이 있는 별 패턴을 나타내기 위해 다음 패턴을 사용할 수 있습니다.
(
a)--(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 = map(reports, manager)
출력
| 종업원 | 연령 | reportingPath |
|---|---|---|
| 조 | 이십구 | [ "Alice" ] |
| 이브 | 27 | [ "Alice", "Bob" ] |
| 벤 | 23 | [ "Alice", "Chris" ] |
다음 예제에서는 Actions 및 Entities 테이블에서 그래프를 작성합니다. 엔터티는 사람 및 시스템이며, 작업은 엔터티 간의 서로 다른 관계를 설명합니다. 그래프를 make-graph 빌드하는 연산자를 따르는 것은 시스템에 대한 공격 경로를 검색하는 그래프 패턴을 사용하여 호출 graph-match 하는 것입니다 "Apollo" .
쿼리 실행
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 연산자
- all()
- any()
- map()
- inner_nodes()