Compartilhar via


operador de correspondência de grafo

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

O operador graph-match pesquisa todas as ocorrências de um padrão de grafo em uma fonte de grafo de entrada.

Nota

Esse operador é usado em conjunto com o operador make-graph.

Sintaxe

G|graph-match [cycles=CyclesOption] Pattern [whereConstraints] project [ColumnName=] de expressão [, ...]

Parâmetros

Nome Tipo Necessário Descrição
G string ✔️ A origem do grafo de entrada.
padrão de string ✔️ Uma ou mais sequências delimitadas por vírgulas de elementos de nó de grafo conectados por elementos de borda do grafo usando notações de grafo. Consulte de notação de padrão do Graph.
restrições de string Uma expressão booliana composta de propriedades de variáveis nomeadas no padrão . Cada elemento de grafo (nó/borda) tem um conjunto de propriedades que foram anexadas a ele durante a construção do grafo. 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. As expressões de projeto devem ser propriedades escalares e de referência de variáveis nomeadas definidas no padrão . 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 , valores permitidos: all, none, unique_edges. Se all for especificado, todos os ciclos serão correspondidos, se none forem especificados, os ciclos não serão correspondidos, se unique_edges (padrão) for especificado, os ciclos serão correspondidos, mas somente se os ciclos não incluirem a mesma borda mais de uma vez.

Notação de padrão de grafo

A tabela a seguir mostra a notação de grafo com suporte:

Elemento Variável nomeada Anônimo
Nodo ( n) ()
Borda direcionada: da esquerda para a direita -[ e]-> -->
Borda direcionada: da direita para a esquerda <-[ e]- <--
Qualquer borda de direção -[ e]- --
Borda de comprimento variável -[ e*3..5]- -[*3..5]-

Borda de comprimento variável

Uma borda de comprimento variável permite que um padrão específico seja repetido várias vezes dentro dos limites definidos. Esse tipo de borda é indicado por um asterisco (*), seguido pelos valores mínimos e máximos de ocorrência no formato mínimo..máximo. Os valores mínimo e máximo devem ser inteiro escalares. Qualquer sequência de bordas que caiam dentro desse intervalo de ocorrências pode corresponder à borda variável do padrão, se todas as bordas na sequência atenderem às restrições descritas na cláusula where.

Várias sequências

Várias sequências delimitadas por vírgula são usadas para expressar padrões não lineares. Para descrever a conexão entre sequências diferentes, elas precisam 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). Não há suporte para apenas padrões de componente conectado único.

Retorna

O operador graph-match retorna um resultado tabular, em que cada registro corresponde a uma correspondência do padrão no grafo.
As colunas retornadas são definidas na cláusula project do operador usando propriedades de bordas e/ou nós definidas no padrão. Propriedades e funções de propriedades de bordas 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 da 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 grafo representam os funcionários e as bordas são de um funcionário para o gerente. Depois de criarmos o grafo usando make-graph, pesquisamos funcionários na organização do Aliceque são mais jovens do que 30.

executar o de consulta

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

de saída

empregado idade reportingPath
Joe 29 [
"Alice"
]
Véspera 27 [
"Alice",
"Bob"
]
Ben 23 [
"Alice",
"Chris"
]

Caminho de ataque

O exemplo a seguir cria um grafo das tabelas Actions e Entities. As entidades são pessoas e sistemas, e as ações descrevem relações diferentes entre entidades. Seguir o operador make-graph que cria o grafo é uma chamada para graph-match com um padrão de grafo que procura caminhos de ataque para o sistema "Apollo".

executar o de consulta

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

de saída

Agressor Comprometida Sistema
Mallory Bob 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 de padrão graph-match é o mesmo que o exemplo anterior e adicionamos uma sequência adicional com o comprometido como um vínculo entre as sequências.

executar o de consulta

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

de saída

Agressor Comprometida Sistema
Mallory Bob Apolo