Поделиться через


Оператор graph-match

Применимо: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Оператор graph-match ищет все вхождения шаблона графа в источнике входного графа.

Заметка

Этот оператор используется в сочетании с оператором make-graph.

Синтаксис

G|graph-match [cycles=CyclesOption] Шаблон [whereограничения] project [ColumnName=] Expression [, ...]

Параметры

Имя Тип Обязательно Описание
G string ✔️ Источник входного графа.
шаблонов string ✔️ Одна или несколько разделенных запятыми последовательностей элементов узла графа, подключенных к пограничным элементам графа с помощью нотации графа. См. нотации шаблонов графов.
Ограничения string Логическое выражение, состоящее из свойств именованных переменных в шаблоне. Каждый элемент графа (node/edge) имеет набор свойств, присоединенных к нему во время построения графа. Ограничения определяют, какие элементы (узлы и края) соответствуют шаблону. Свойство ссылается на имя переменной, за которым следует точка (.) и имя свойства.
выражения string ✔️ Предложение project преобразует каждый шаблон в строку в табличном результате. Выражения проекта должны быть скалярными и ссылочными свойствами именованных переменных, определенными в шаблоне. Свойство ссылается на имя переменной, за которым следует точка (.) и имя атрибута.
CyclesOption string Определяет, соответствуют ли циклы в шаблоне, допустимые значения: all, none, unique_edges. Если указан all, то все циклы совпадают, если none заданы циклы не совпадают, если указано unique_edges (по умолчанию), циклы совпадают, но только если циклы не включают один и тот же край несколько раз.

Нотация шаблона графа

В следующей таблице показана поддерживаемая нотация графа:

Элемент Именованной переменной Анонимный
Узел ( n) ()
Направленный край: слева направо -[ ]-> -->
Направленный край: справа налево <-[ ]- <--
Любой край направления -[ ]- --
Ребра переменной длины -[ *3..5]- -[*3..5]-

Ребра переменной длины

Ребра переменной длины позволяет повторять определенный шаблон несколько раз в пределах определенных ограничений. Этот тип края обозначается звездочкой (*), а затем минимальными и максимальными значениями вхождения в формате ..min max. Минимальное и максимальное значения должны быть целочисленными скалярами. Любая последовательность ребер, входящих в этот диапазон вхождения, может соответствовать переменной краю шаблона, если все края в последовательности удовлетворяют ограничениям, описанным в предложении where.

Несколько последовательностей

Для выражения нелинейных шаблонов используются несколько разделенных запятыми последовательностей. Чтобы описать соединение между разными последовательности, они должны предоставить общий доступ к одному или нескольким имени переменной узла. Например, чтобы выразить шаблон звездочки с узлом n в центре звезды и подключен к узлам ,b,c и d можно использовать следующий шаблон: ()--(n)--(b),(c)--(n)--(d). Nore, что поддерживаются только отдельные шаблоны подключенных компонентов.

Возвращает

Оператор 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 [
"Алиса"
]
Канун 27 [
"Алиса",
"Боб"
]
Бен 23 [
"Алиса",
"Крис"
]

Путь атаки

В следующем примере создается граф из таблиц 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

выходных

Атакующий Скомпрометированы Система
Мэллори Отвес Аполлон

Шаблон "Звезда"

Следующий пример аналогичен предыдущему примеру пути атаки, но с дополнительным ограничением: мы хотим, чтобы скомпрометированная сущность также взаимодействовала с Алиса. Префикс шаблона 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

выходных

Атакующий Скомпрометированы Система
Мэллори Отвес Аполлон