Compartir a través de


Operador graph-match

Se aplica a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

El graph-match operador busca todas las apariciones de un patrón de grafo en un origen de grafo de entrada.

Nota:

Este operador se usa con el operador make-graph de .

Sintaxis

G|graph-match [cycles=CyclesOption] Pattern [whereConstraints] project [ColumnName=] Expression [, ...]

Parámetros

Nombre Tipo Obligatorio Descripción
G string ✔️ Origen del gráfico de entrada.
Patrón string ✔️ Una o varias secuencias delimitadas por comas de elementos de nodo de grafos conectados por elementos perimetrales de grafos mediante notaciones de grafos. Consulte Notación de patrones de Graph.
Restricciones string Expresión booleana compuesta por propiedades de variables con nombre en el patrón. Cada elemento de grafo (nodo/borde) tiene un conjunto de propiedades que se adjuntaron a él durante la construcción del grafo. Las restricciones definen qué elementos (nodos y bordes) coinciden con el patrón . Se hace referencia a una propiedad con el nombre de la variable seguido de un punto (.) y el nombre de la propiedad.
Expresión string ✔️ La project cláusula convierte cada patrón en una fila en un resultado tabular. Las expresiones de proyecto deben ser propiedades escalares y de referencia de variables con nombre definidas en el patrón. Se hace referencia a una propiedad por el nombre de la variable seguido de un punto (.) y el nombre del atributo.
CyclesOption string Controla si los ciclos coinciden en el patrón, los valores permitidos: all, none, unique_edges. Si all se especifica , todos los ciclos coinciden, si none no coinciden los ciclos especificados, si unique_edges se especifica (valor predeterminado), los ciclos se coinciden, pero solo si los ciclos no incluyen el mismo borde más de una vez.

Notación de patrones de grafo

En la tabla siguiente se muestra la notación de grafo admitida:

Elemento Variable con nombre Anónimo
Nodo ( n) ()
Borde dirigido: de izquierda a derecha -[ e]-> -->
Borde dirigido: de derecha a izquierda <-[ e]- <--
Cualquier borde de dirección -[ e]- --
Borde de longitud variable -[ e*3..5]- -[*3..5]-

Borde de longitud variable

Un borde de longitud variable permite repetir un patrón específico varias veces dentro de los límites definidos. Este tipo de borde se indica mediante un asterisco (*), seguido de los valores de repetición mínimo y máximo en formato mínimo... Los valores mínimo y máximo deben ser escalares enteros . Cualquier secuencia de bordes que se encuentran dentro de este intervalo de repeticiones puede coincidir con el borde variable del patrón, si todos los bordes de la secuencia satisfacen las restricciones descritas en la where cláusula .

Varias secuencias

Se usan varias secuencias delimitadas por comas para expresar patrones no lineales. Para describir la conexión entre diferentes secuencias, deben compartir uno o varios nombres de variable de un nodo. Por ejemplo, para representar un patrón de estrella con el nodo n en el centro conectado a los nodos a,b,c y d, se podría usar el siguiente patrón:

( un)--(n)--(b,c)()--(n)--(d)

Solo se admiten patrones de componentes conectados únicos.

Devoluciones

El graph-match operador devuelve un resultado tabular, donde cada registro corresponde a una coincidencia del patrón en el gráfico.
Las columnas devueltas se definen en la cláusula del project operador mediante propiedades de bordes o nodos definidos en el patrón. Las propiedades y funciones de las propiedades de bordes de longitud variable se devuelven como una matriz dinámica, cada valor de la matriz corresponde a una aparición del borde de longitud variable.

Ejemplos

En el ejemplo siguiente se representa una jerarquía organizativa. Muestra cómo se podría usar un borde de longitud variable para buscar empleados de distintos niveles de la jerarquía en una sola consulta. Los nodos del gráfico representan a los empleados y los bordes son de un empleado a su jefe. Después de compilar el grafo mediante make-graph, buscamos empleados de la Aliceorganización que son más jóvenes 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 = map(reports, manager)

Salida

empleado edad reportingPath
Joe 29 [
"Alice"
]
Víspera 27 [
"Alice",
"Bob"
]
Ben 23 [
"Alice",
"Chris"
]

En el ejemplo siguiente se compila un gráfico a partir de las Actions tablas y Entities . Las entidades son personas y sistemas, y las acciones describen relaciones diferentes entre entidades. Después del make-graph operador que compila el grafo es una llamada a graph-match con un patrón de grafo que busca rutas de acceso de ataque al "Apollo" sistema.

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

Salida

Atacante Comprometido Sistema
Mallory Bob Apolo

El ejemplo siguiente es similar al ejemplo de ruta de acceso de ataque anterior, pero con una restricción adicional: queremos que la entidad comprometida también se comunique con Alice. El graph-match prefijo de patrón es el mismo que el ejemplo anterior y agregamos otra secuencia con el comprometido como un vínculo entre las secuencias.

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

Salida

Atacante Comprometido Sistema
Mallory Bob Apolo