Оператор graph-match
Применимо: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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
выходных
Атакующий | Скомпрометированы | Система |
---|---|---|
Мэллори | Отвес | Аполлон |