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 Alice
la 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 |
Contenido relacionado
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de