Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 variableFiltrado de etiquetas:
:Personrestringe las coincidencias a los nodos con la etiqueta PersonCombinaciones de etiquetas: usar
¶ 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ónTipos perimetrales: usar etiquetas como
:works_atfiltrar por tipo de relaciónVarios tipos:
knows|likescoincide 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&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 posteriorAcceso 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.idHora 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 |