operador de correspondência gráfica
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
O operador graph-match
procura todas as ocorrências de um padrão gráfico em uma fonte de gráfico de entrada.
Sintaxe
G|
graph-match
[cycles
=
CyclesOption] Pattern [where
Constraints] project
[ColumnName=
] Expression [,
...]
Parâmetros
Designação | Tipo | Necessário | Descrição |
---|---|---|---|
G | string |
✔️ | A fonte do gráfico de entrada. |
Padrão | string |
✔️ | Uma ou mais sequências delimitadas por vírgulas de elementos de nó de grafos conectados por elementos de borda de grafo usando notações de grafo. Consulte Notação de padrão de gráfico. |
Restrições | string |
Uma expressão booleana composta por propriedades de variáveis nomeadas no Pattern. Cada elemento gráfico (nó/aresta) tem um conjunto de propriedades que foram anexadas a ele durante a construção do gráfico. As restrições definem quais elementos (nós e bordas) são correspondidos pelo padrão. Uma propriedade é referenciada pelo nome da variável seguido por um ponto (. ) e o nome da propriedade. |
|
Expressão | string |
✔️ | A cláusula project converte cada padrão em uma linha em um resultado tabular. A(s) expressão(ões) do projeto devem ser escalares e propriedades de referência de variáveis nomeadas definidas no Padrão de. Uma propriedade é referenciada pelo nome da variável seguido por um ponto (. ) e o nome do atributo. |
CyclesOption | string |
Controla se os ciclos são correspondidos no Padrão de, valores permitidos: all , none , unique_edges . Se all for especificado, todos os ciclos serão correspondidos, se none for especificado os ciclos não forem correspondidos, se unique_edges (padrão) for especificado, os ciclos serão correspondidos, mas somente se os ciclos não incluírem a mesma borda mais de uma vez. |
Notação de padrão gráfico
A tabela a seguir mostra a notação gráfica suportada:
Elemento | Variável nomeada | Anônimo |
---|---|---|
Nó |
(
n) |
() |
Borda direcionada: da esquerda para a direita |
-[
e]-> |
--> |
Borda direcionada: da direita para a esquerda |
<-[
e]- |
<-- |
Qualquer borda de direção |
-[
e]- |
-- |
Aresta de comprimento variável |
-[
e*3..5]- |
-[*3..5]- |
Aresta de comprimento variável
Uma borda de comprimento variável permite que um padrão específico seja repetido várias vezes dentro de limites definidos. Este tipo de aresta é indicado por um asterisco (*
), seguido dos valores mínimos e máximos de ocorrência no formato min..
max. Os valores mínimo e máximo devem ser inteiros escalares. Qualquer sequência de arestas que se enquadre neste intervalo de ocorrência pode corresponder à aresta variável do padrão, se todas as arestas na sequência satisfizerem as restrições descritas na cláusula where
.
Múltiplas sequências
Várias sequências delimitadas por vírgulas são usadas para expressar padrões não lineares. Para descrever a conexão entre diferentes sequências, eles têm que compartilhar um ou mais nomes de variáveis de um nó. Por exemplo, para expressar um padrão de estrela com um nó n no centro da estrela e conectado a nós um,b,c e d o seguinte padrão pode ser usado: (
um)--(
n)--(
b)
,(
c)--(
n)--(
d)
. E não há suporte para apenas padrões de componentes conectados únicos.
Devoluções
O operador graph-match
retorna um resultado tabular, onde cada registro corresponde a uma correspondência do padrão no gráfico.
As colunas retornadas são definidas na cláusula project
do operador usando propriedades de bordas e/ou nós definidos no padrão. Propriedades e funções de propriedades de arestas de comprimento variável são retornadas como uma matriz dinâmica, cada valor na matriz corresponde a uma ocorrência da borda de comprimento variável.
Exemplos
Todos os funcionários na organização de um gerente
O exemplo a seguir representa uma hierarquia organizacional, demonstra como uma borda de comprimento variável pode ser usada para localizar funcionários de diferentes níveis da hierarquia em uma única consulta. Os nós no gráfico representam funcionários e as bordas são de um funcionário para seu gerente. Depois de construirmos o gráfico usando make-graph
, pesquisamos por funcionários na organização da Alice
que são menores do que 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
Output
empregado | idade | reportingPath |
---|---|---|
Zé | 29 | [ "Alice" ] |
Véspera | 27 | [ "Alice", "Bob" ] |
Ben | 23 | [ "Alice", "Chris" ] |
Caminho de ataque
O exemplo a seguir cria um gráfico a partir das tabelas Actions
e Entities
. As entidades são pessoas e sistemas, e as ações descrevem diferentes relações entre entidades. Seguindo o operador make-graph
que constrói o gráfico é uma chamada para graph-match
com um padrão de gráfico que procura caminhos de ataque para o sistema "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
Output
Atacante | Comprometido | Sistema |
---|---|---|
Mallory | Joaquim | Apolo |
Padrão de estrela
O exemplo a seguir é semelhante ao exemplo de caminho de ataque anterior, mas com uma restrição adicional: queremos que a entidade comprometida também se comunique com Alice. O prefixo do padrão graph-match
é o mesmo do exemplo anterior e adicionamos uma sequência adicional com o comprometido como um link entre as sequências.
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
Output
Atacante | Comprometido | Sistema |
---|---|---|
Mallory | Joaquim | Apolo |