Referencia del lenguaje de consulta de grafos (GQL) para Microsoft Sentinel gráfico (versión preliminar)

Se aplica a: Microsoft Sentinel Graph

Nota:

La compatibilidad con GQL está en versión preliminar. Las características y la sintaxis pueden cambiar en función de los comentarios y el desarrollo continuo.

En esta referencia se tratan los conceptos fundamentales, las funciones y los operadores del Lenguaje de consulta de Graph (GQL). Graph Query Language (GQL) se basa en conceptos matemáticos de teoría de grafos que proporcionan una base sólida para consultar datos de grafos. Comprender estos aspectos básicos le ayuda a escribir consultas más eficaces y a comprender mejor cómo GQL procesa los datos. GQL también proporciona un amplio conjunto de funciones y operadores para trabajar con patrones de grafos, nodos, bordes y propiedades.

Conceptos fundamentales

En esta sección se tratan los conceptos básicos que forman la base del análisis de datos de grafos con GQL.

Patrones de gráficos

Los patrones de grafos son los principales bloques de creación de consultas GQL. Describen la estructura que desea encontrar en los datos del grafo mediante una sintaxis declarativa que refleja la representación visual de los gráficos.

Patrones de nodo

Los patrones de nodo especifican cómo hacer coincidir nodos individuales en el gráfico:

(n)                 -- Any node
(n:Person)          -- Node with Person label
(n:Person&City)     -- Node with Person AND City label
(:Person)           -- Person node, don't bind variable

Conceptos clave:

  • Enlace de variables: crea una variable n a la que puede hacer referencia más adelante en la consulta. (n)

  • Nodos anónimos: (:Person) coincide con nodos sin crear una variable

  • Filtrado de etiquetas: :Person restringe las coincidencias a los nodos con la etiqueta Person

  • Combinaciones de etiquetas: usar & para AND, | para operaciones OR

Patrones perimetrales

Los patrones perimetrales definen cómo se conectan los nodos entre sí:

-[e]->                  -- Directed outgoing edge, any label 
-[e:works_at]->         -- Directed edge, works_at label
-[e:knows|likes]-->    -- knows OR likes edge
<-[e]-                  -- Directed incoming edge
-[e]-                   -- Undirected (any direction) 

Conceptos clave:

  • Dirección: -> para salientes, <- entrantes, - para cualquier dirección

  • Tipos perimetrales: usar etiquetas como :works_at filtrar por tipo de relación

  • Varios tipos: knows|likes coincide con cualquier tipo de relación

Expresiones de etiqueta

Las etiquetas proporcionan significado semántico a los nodos y bordes. GQL admite expresiones de etiqueta complejas:

:Person&amp;Company     -- Both Person AND Company labels 
:Person|Company        -- Person OR Company labels
:!Company               -- NOT Company label
:(Person|!Company)&City -- Complex expressions with parentheses 

Operadores

  • & (AND): Node debe tener todas las etiquetas especificadas

  • | (OR): Node debe tener al menos una etiqueta especificada.

  • ! (NOT): Node no debe tener la etiqueta especificada.

  • () : paréntesis para agrupar expresiones complejas

Patrones de ruta de acceso

Los patrones de ruta de acceso describen las relaciones de varios saltos en el gráfico:

(a)-[e1]->;(b)-[e2]->(c)     -- 2-hop path 
(a)-[e]->;{2,4}(b)              -- 2 to 4 hops
(a)-[e]->{1,}(b)             -- 1 to maximum of 8 hops
(a)-[:knows|likes]->;{1,3}(b)  -- 1-3 hops via knows/likes 
p=()-[:works_at]->()         -- Binding a path variable 

Rutas de acceso de longitud variable:

  • {2,4}: exactamente de 2 a 4 saltos

  • {1,}: 1 o más saltos (sin enlazar). Las consultas de ruta de acceso sin enlazar se limitan a 8 saltos.

  • {,5}: hasta 5 saltos

  • {5}: exactamente 5 saltos

Variables de ruta de acceso

  • p=()->(): captura toda la ruta de acceso para un análisis posterior

  • Acceso con NODES(p), , RELATIONSHIPS(p)PATH_LENGTH(p)

Varios patrones

GQL admite estructuras de grafo complejas y no lineales:

(a)->(b), (a)->(c)          -- Multiple edges from same node
(a)->(b)<-(c), (b)->(d)     -- Non-linear structures

Composición del patrón:

  • Uso de comas , para separar varios patrones
  • Todos los patrones deben coincidir simultáneamente
  • Las variables se pueden compartir entre patrones

Modos de coincidencia

GQL admite diferentes modos de coincidencia de rutas de acceso que controlan cómo se comparan los patrones con los datos de grafos. Estos modos afectan al rendimiento, la integridad de los resultados y los tipos de rutas de acceso que se devuelven.

Los modos de coincidencia controlan cómo se pueden reutilizar los elementos de grafo entre variables de patrón dentro de una sola cláusula MATCH.

BORDES DIFERENTES (valor predeterminado)

Modo predeterminado. Un borde coincidente no puede enlazarse a más de una variable perimetral, pero los nodos se pueden reutilizar libremente.

MATCH (a)-[r1]->(b)-[r2]->(c) 
-- r1 and r2 must be different edges
-- a, b, c can be the same or different nodes 

ELEMENTOS REPETIBLES

Permite que los bordes y los nodos se reutilicen entre variables de patrón sin restricciones.

MATCH REPEATABLE ELEMENTS (a)-[r1]->(b)-[r2]->(c)
-- r1 and r2 can be the same edge
-- a, b, c can be the same or different nodes

Modos de ruta de acceso

Los modos de ruta de acceso controlan qué tipos de rutas de acceso se incluyen en los resultados en función de las restricciones de repetición.

TRAIL

Filtra las rutas de acceso que tienen bordes repetidos. Los nodos pueden repetirse, pero cada borde solo puede aparecer una vez por ruta de acceso.

MATCH TRAIL (a)-[]->{1,3}(b)
-- No edge can appear twice in the same path
-- Nodes may repeat

Referencia de funciones y operadores

Graph Query Language (GQL) proporciona un amplio conjunto de funciones y operadores para trabajar con patrones de gráficos, nodos, bordes y propiedades.

Funciones y operadores principales de GQL

En la tabla siguiente se enumeran las funciones y operadores principales de GQL, y ejemplos.

Función o operador GQL Description Ejemplo de GQL
MATCH Búsqueda de patrones de gráficos MATCH (a)-[r]->(b)
COINCIDENCIA OPCIONAL Búsqueda de patrones que podrían no existir OPTIONAL MATCH (p)->(c:City)
DÓNDE Propiedades y patrones de filtro WHERE person.age25 >
FILTER Equivalente a WHERE, pero se usa sin cláusulas MATCH FILTER p.name = 'Carol' OR c.name = 'Seattle'
IS NULL Comprobación de valores NULL WHERE person.age ES NULL
NO ES NULL Comprobación de valores que no son NULL WHERE person.age NO ES NULL
VOLVER Resultados del proyecto RETURN person.name, person.age
DISTINCT Devolver valores únicos RETURN DISTINCT person.name
COUNT(*) Contar todas las filas RETURN COUNT(*)
COUNT() Recuento de valores que no son NULL RETURN COUNT(person.name)
SUM() Suma de valores numéricos RETURN SUM(person.age)
MIN() El valor mínimo RETURN MIN(person.age)
MAX() Valor máximo RETURN MAX(person.age)
AVG() Valor medio RETURN AVG(person.age)
COLLECT_LIST() Recopilación de valores en la matriz RETURN COLLECT_LIST(person.name)
SIZE() Longitud de la matriz RETURN SIZE(COLLECT_LIST(n.firstName))
labels() Mostrar etiquetas para un nodo o borde RETURN labels(entity)
UPPER() Convertir a mayúsculas RETURN UPPER(person.name)
LOWER() Conversión a minúsculas RETURN LOWER(person.name)
COMIENZA CON La cadena comienza con el patrón DONDE person.name COMIENZA CON "Tom"
TERMINA CON La cadena termina con el patrón DONDE person.name TERMINA CON "Hanks"
CONTAINS Cadena contiene patrón DÓNDE PERSON.NAME CONTIENE "Tom"
|| Concatenación de cadenas RETURN n.firstName || ' ' || n.lastName
TRIM() Eliminación del espacio en blanco de ambos extremos RETURN TRIM(' abc ')
STRING_JOIN() Combinación de elementos de matriz con delimitador RETURN STRING_JOIN(["a", "b" || "c"], "-")
CAST() Conversión de tipos de datos CAST(person.age AS STRING)
ZONED_DATETIME() Creación de datetime a partir de una cadena ZONED_DATETIME('2024-01-01')
PATH_LENGTH() Obtener la longitud de una ruta de acceso RETURN PATH_LENGTH(path_variable)
ORDER BY Ordenar resultados ORDER BY person.age DESC
LIMIT Limitar el recuento de resultados LIMIT 10
& (AND) Intersección de etiquetas MATCH (p:Person & Male)
| (O) Unión de etiquetas MATCH (n:Person | Película)
! (NOT) Negación de etiquetas MATCH (p:! Mujer)

Procedimientos recomendados

  • GQL no define claramente cómo se deben controlar los tipos dinámicos. Para evitar errores en tiempo de ejecución, convierta explícitamente los campos anidados a su tipo esperado (consulte CAST).

Optimización del rendimiento

Use estas estrategias para optimizar el rendimiento de las consultas de GQL en entornos de producción:

Sugerencia

Comience con patrones simples y, a continuación, aumente la complejidad si es necesario. Supervise el rendimiento de las consultas y ajuste las longitudes de ruta de acceso y los filtros para mejorar los resultados.

Limitar el ámbito de coincidencia de ruta de acceso:

  • Usar filtros de etiqueta específicos para reducir el espacio de búsqueda: MATCH (start:SpecificType) en lugar de MATCH (start)

  • Limitar rutas de acceso de longitud variable con límites razonables: MATCH (a)-[]->{1,3}(b) en lugar de rutas de acceso sin enlazar

  • Aplique las cláusulas WHERE al principio para filtrar los resultados antes de operaciones costosas.

Use COUNT(*) para las comprobaciones de existencia:

Si solo necesita comprobar si existe un patrón, use COUNT(*) en lugar de devolver los resultados completos.

MATCH (user:User)-[:SUSPICIOUS_ACTIVITY]->(target)
WHERE user.id = 'user123'
RETURN COUNT(*) > 0 AS HasSuspiciousActivity

Limitaciones

  • Estructura de consulta: todas las consultas de GQL deben comenzar con una instrucción MATCH.

  • Palabras clave reservadas: algunas palabras clave de GQL no se pueden usar como identificadores en las consultas. Algunas palabras clave reservadas no son inmediatamente obvias (por ejemplo, DATE es una palabra clave reservada). Si los datos del grafo tienen nombres de propiedad que entran en conflicto con las palabras clave reservadas de GQL, use nombres de propiedad diferentes en el esquema del grafo o cámbiele el nombre para evitar conflictos de análisis.

Importante

Al diseñar el esquema del grafo, algunos nombres de propiedad comunes pueden entrar en conflicto con las palabras clave reservadas de GQL. Evite o cambie el nombre de estos nombres de propiedad.

  • No se admite INSERT/CREATE: no se admiten las operaciones para cambiar las estructuras de grafos.

  • Coincidencias opcionales: solo se admite para patrones de nodo (no bordes).

  • No se admiten las comprobaciones de equivalencia de entidades: no se admiten las de (MATCH (n)-[]-(n2) WHERE n1 <> n2) GQL. Use comparaciones de campos explícitas en su lugar, por ejemplo, n.id <> n2.id

  • Hora y zona horaria: el motor funciona en UTC. Los literales datetime deben usar datetime con zona; solo se admite la zona UTC a través de ZONED_DATETIME("2011-12-31 23:59:59.9").

  • Granularidad de la duración: las duraciones admiten hasta días y unidades más pequeñas hasta nanosegundos. No se admiten unidades de mayor tamaño que el día (por ejemplo, semanas, meses, años).

Función GQL personalizada labels()

La labels() función muestra las etiquetas de un nodo o borde como una matriz.

Sintaxis:

labels(entity)

Parámetros:entity: un nodo o una variable perimetral de un patrón coincidente.

Devuelve:

Devuelve una matriz de cadenas con todas las etiquetas de la entidad especificada.

Ejemplos:

Mostrar etiquetas para nodos coincidentes:

MATCH (entity)
RETURN entity.name, labels(entity)

Resultado

Esta consulta muestra el nombre y todas las etiquetas de cada nodo del gráfico.

entity.name labels(entity)
john.doe ["User"]
admin.user ["User"]
servidor web ["System"]
base de datos ["System"]
controlador de dominio ["System"]

Mostrar etiquetas en proyecciones con alias:

MATCH (n)-[e]->(target)
RETURN n.name, labels(n) AS n_labels, labels(e) AS edge_labels, target.name

Esta consulta muestra los nombres de nodo, sus etiquetas y las etiquetas de los bordes de conexión.

n.name n_labels edge_labels target.name
john.doe ["User"] ["CAN_ACCESS"] servidor web
admin.user ["User"] ["CAN_ACCESS"] controlador de dominio
servidor web ["System"] ["CAN_ACCESS"] base de datos
controlador de dominio ["System"] ["CAN_ACCESS"] base de datos