operador de correspondência de grafo
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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 [where
Constraints] project
[ColumnName=
] de expressão [,
...]
Parâmetros
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 Alice
que 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 |
Conteúdo relacionado
- operadores Graph
- operador make-graph