Compartir a través de


Operador graph-match

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 junto con el operador make-graph.

Sintaxis

G | graph-match [cycles = CyclesOption] Restricciones de patrón project where [ColumnName =] Expresión [, ...]

Parámetros

Nombre Type 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.
Expression 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 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ónimas
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 (versión preliminar)

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 expresar un patrón de estrella con un nodo n en el centro de la estrella y conectado a los nodos a,b,c y d se podría usar el siguiente patrón: (a)--(n)--(b,c)--()( n)--(d.) Nore que 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

Todos los empleados de la organización de un administrador

En el ejemplo siguiente se representa una jerarquía organizativa, se 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 gráfico mediante make-graph, buscamos empleados en Alicela organización de 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 = reports.manager

Salida

empleado age reportingPath
Joe 29 [
"Alice"
]
Eve 27 [
"Alice",
"Bob"
]
Ben 23 [
"Alice",
"Chris"
]

Ruta de acceso de ataque

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 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

Salida

Atacante Comprometido Sistema
Mallory Bob Apollo

Patrón star (versión preliminar)

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 una secuencia adicional con el comprometido como 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 Apollo