Partilhar via


operador de correspondência gráfica

Aplica-se a: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

O operador graph-match procura todas as ocorrências de um padrão gráfico em uma fonte de gráfico de entrada.

Observação

Este operador é usado em conjunto com o operador de make-graph .

Sintaxe

G|graph-match [cycles=CyclesOption] Pattern [whereConstraints] 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) ()
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 Aliceque 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
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