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.
Los patrones de grafos son bloques de creación principales de las consultas GQL en el grafo de Microsoft Fabric. Describen las estructuras que busca en el gráfico mediante nodos y bordes de una manera visual intuitiva. Piense en los patrones de grafos como plantillas que el motor de consultas intenta comparar con los datos reales del grafo.
En este artículo se explican la sintaxis y las reglas de composición para los patrones de grafos en GQL.
Importante
Este artículo utiliza exclusivamente el conjunto de datos de ejemplo de grafos de redes sociales.
Patrones de elementos simples
Los patrones de elementos simples le ayudan a coincidir con nodos y bordes individuales del grafo que cumplen requisitos específicos. Estos patrones forman la base para la coincidencia de patrones más compleja.
Patrones de nodo simples
Un patrón de nodo especifica las etiquetas y propiedades que un nodo debe tener para que coincida:
(:Place&City { name: "New York" })
Este patrón coincide con todos los nodos que tienen lasPlace etiquetas y City (indicadas por el & operador) y cuya name propiedad es igual a "New York". Esta combinación de etiquetas y propiedades necesarias se denomina relleno del patrón de nodo.
Conceptos clave:
-
Coincidencia de etiquetas: use
¶ requerir varias etiquetas. - Filtrado de propiedades: especifique valores exactos que deben coincidir las propiedades.
- Coincidencia flexible ("covariante"): los nodos coincidentes pueden tener más etiquetas y propiedades más allá de las especificadas.
Nota:
Los nodos pueden tener varias etiquetas, pero todavía no se admiten tipos perimetrales con varias etiquetas.
Patrones de borde simples
Los patrones perimetrales son más complejos que los patrones de nodo. No solo especifican un relleno, sino que también conectan un patrón de nodo de origen con un patrón de nodo objetivo. Los patrones perimetrales describen los requisitos tanto en el perímetro como en sus puntos de conexión:
(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)
La dirección -[...]-> de la flecha es importante: determina (:Person) como el patrón del nodo de origen y (:Comment) como el patrón del nodo objetivo. Comprender la dirección del borde es fundamental para consultar correctamente el grafo.
Patrón reflejado equivalente:
Puede voltear la flecha e intercambiar los patrones de nodo para crear el patrón de borde equivalente reflejado:
(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)
Este patrón busca las mismas relaciones, pero desde la perspectiva opuesta.
Patrones de borde dirigidos a cualquier dirección
Cuando la dirección de un borde de grafo no importa para la consulta, puede dejarla sin especificar mediante la creación de un patrón perimetral dirigido:
(:Song)-[:inspired]-(:Movie)
Este patrón coincide con las mismas aristas que (:Song)-[:inspired]->(:Movie) y (:Movie)-[:inspired]->(:Song) combinadas, independientemente de cuál nodo sea el origen y cuál el destino (este ejemplo no pertenece al tipo grafo de red social).
Métodos abreviados de patrones perimetrales de grafos
GQL proporciona métodos abreviados prácticos para patrones perimetrales comunes para que las consultas sean más concisas:
-
()->()()-[]->()significa (borde dirigido con cualquier etiqueta) -
()<-()()<-[]-()significa (borde dirigido a la inversa con cualquier etiqueta) -
()-()()-[]-()significa (borde dirigido con cualquier etiqueta)
Estos accesos directos pueden ser útiles cuando se preocupa por la conectividad, pero no sobre el tipo perimetral de grafo específico.
Expresiones de etiqueta
Los patrones pueden expresar requisitos complejos en las etiquetas de los nodos y bordes coincidentes.
Example:
MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches
Esto cuenta el número de isLocatedIn bordes que conectan Person nodos o Organizationnodos (pero no)Company (que siempre University son nodos del esquema de red social) a City o Country nodos.
Sintaxis:
| Syntax | Meaning |
|---|---|
A&B |
Las etiquetas deben incluir A y B. |
A\|B |
Las etiquetas deben incluir al menos una de A o B. |
!A |
Las etiquetas deben excluir A. |
Además, use paréntesis para controlar el orden de evaluación de expresiones de etiqueta. De forma predeterminada, ! tiene la prioridad más alta y & tiene mayor prioridad que |. Por lo tanto, !A&B|C|!D es igual que ((!A)&B)|C|(!D).
Variables de enlace
Las variables permiten hacer referencia a elementos de grafos coincidentes en otras partes de la consulta. Comprender cómo enlazar y usar variables es esencial para crear consultas eficaces.
Variables de elemento de enlace
Los patrones de nodo y borde pueden enlazar nodos coincidentes y bordes a variables para una referencia posterior.
(p:Person)-[w:workAt]->(c:Company)
En este patrón, p está enlazado a nodos coincidentes, Person a bordes coincidentes wworkAt y c a nodos coincidentesCompany.
Reutilización variable para restricciones estructurales:
La reutilización de la misma variable en un patrón varias veces expresa una restricción en la estructura de coincidencias. Cada aparición de la misma variable siempre debe enlazarse al mismo elemento de grafo en una coincidencia válida. La reutilización de variables es eficaz para expresar requisitos estructurales complejos.
(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
El patrón busca nodos y que se conocen entre sí y funcionan en el mismo Person, que está enlazado a la variable x.yCompanyc La reutilización de c garantiza que ambas personas trabajen en la misma empresa.
Predicados de patrón con variables de elemento:
Las variables de elemento de enlace permiten especificar predicados de patrón de nodo y borde. En lugar de proporcionar un relleno con valores exactos de propiedad como { name: "New York, USA" }, un relleno puede especificar un predicado que se evalúa para cada elemento candidato. El patrón solo coincide si el predicado se evalúa como TRUE:
(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)
El patrón de borde busca personas que se conocían entre sí desde el 1 de enero de 2000, usando una condición flexible en lugar de una coincidencia exacta.
Nota:
Las variables de patrón perimetral siempre se enlazan al borde individual en el predicado de patrón de borde, incluso cuando se usan patrones de longitud variable. Esto puede ayudar a no tener que quitar las variables de lista de grupos perimetrales para realizar un filtro posterior. Consulte Enlazar variables perimetrales de patrón de longitud variable.
Técnicas avanzadas de predicado de patrones:
Los predicados de patrón proporcionan funcionalidades de filtrado insertadas eficaces que pueden mejorar la legibilidad de las consultas:
-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.birthday < 19900101 AND p.gender = 'female')
-[:workAt]->
(c:Company WHERE c.name STARTS WITH 'A')
-- Filter on an edge property
MATCH (p1:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.browserUsed = 'Firefox' AND c.name IS NOT NULL
-- Filter during matching and after
MATCH (p:Person WHERE p.gender = 'male')-[:workAt]->(c:Company)
WHERE p.birthday < 19900101 AND c.url IS NOT NULL
Sugerencia
Mantén un predicado dentro del patrón cuando describa qué nodo o arista puede participar en la coincidencia.
Variables de ruta de acceso de enlace
También puede enlazar una ruta de acceso coincidente a una variable de ruta de acceso para su posterior procesamiento o para devolver la estructura de ruta de acceso completa al usuario:
p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
Aquí, p está enlazado a un valor de ruta de acceso que representa la estructura de ruta de acceso coincidente completa, incluidos los valores de referencia de todos los nodos y bordes en el orden especificado.
Los caminos acotados pueden ser devueltos al usuario o procesados posteriormente usando funciones como NODES o EDGES:
MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges
Patrones de redacción
Las consultas del mundo real suelen requerir patrones más complejos que estructuras simples de nodos perimetrales. GQL proporciona varias maneras de componer patrones para recorridos de grafos sofisticados.
Patrones de ruta de acceso de redacción
Los patrones de ruta de acceso se pueden componer concatenando patrones de nodo y borde simples para crear recorridos más largos.
(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
El patrón atraviesa desde una persona a través de sus conexiones sociales y profesionales para encontrar dónde se encuentra la empresa de su compañero.
Construcción de patrones por piezas: También puede crear patrones de ruta de acceso de forma más incremental, lo que puede facilitar la lectura y comprensión de patrones complejos:
(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
Este enfoque divide el mismo recorrido en pasos lógicos, lo que facilita la comprensión y depuración.
Redacción de patrones no lineales
La forma resultante de un patrón no tiene que ser una ruta de acceso lineal. Puede coincidir con estructuras más complejas como patrones "con forma de estrella" que radian desde un nodo central:
(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)
El patrón busca a una persona junto con sus preferencias de educación, empleo y contenido a la vez, una consulta de perfil completa.
Los patrones en el mismo MATCH no tienen que compartir una variable. Los patrones desconectados forman un producto cartesiano de sus coincidencias. Reutiliza una variable cuando los patrones deben vincular el mismo elemento del grafo y solo deben quedar las combinaciones unidas.
Reutilización de elementos de control
GQL controla nodos y aristas repetidos en dos niveles:
- Un modo de coincidencia se aplica al patrón completo del grafo, incluyendo caminos separados por comas.
- Un modo camino se aplica a un camino.
El modo de partida por defecto es REPEATABLE ELEMENTS. Permite que el mismo enlace de elementos ocurra en diferentes partes del patrón de grafo, sujeto al modo camino de cada camino. Puedes escribirlo explícitamente:
REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
Usa DIFFERENT EDGES o es sinónimo DIFFERENT RELATIONSHIPS de requerir unicidad de aristas a lo largo de todo el patrón del grafo. Este modo de coincidencia también cambia cualquier WALK camino en el patrón en TRAIL comportamiento.
DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
Los siguientes modos de camino controlan los elementos repetidos dentro de cada camino:
| Modo de ruta | Reutilización de elementos |
|---|---|
WALK |
Los nodos y aristas pueden repetirse. |
TRAIL |
Las aristas no pueden repetirse, pero los nodos sí pueden repetirse. |
SIMPLE |
Los nodos no pueden repetirse, salvo que el primer y el último nodo pueden ser iguales. Los bordes no pueden repetirse. |
ACYCLIC |
Los nodos no pueden repetirse, incluyendo el primer y el último nodo. Los bordes no pueden repetirse. |
WALK es el modo de ruta por defecto. Prefijo un camino con otro modo cuando necesites una unicidad de elemento más estricta:
Para SIMPLE y ACYCLIC, la unicidad de aristas se deduce de la unicidad del nodo. Un SIMPLE camino puede cerrarse volviendo a su primer nodo, pero aún así no puede reutilizar un borde.
TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)
El TRAIL patrón produce solo coincidencias en las que e1, e2, y e3 son diferentes. Los nodos aún pueden repetirse, por lo que el camino puede formar un ciclo sin reutilizar una arista.
Controla qué caminos se devuelven
Un prefijo de búsqueda de rutas controla qué rutas devuelve un patrón de camino. El prefijo predeterminado ALL devuelve todos los caminos que coinciden con el modo y patrón del camino. Puedes escribir ALL explícitamente:
ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)
Úsase ANY SHORTEST para devolver el camino más corto que coincida para cada par origen-destino de cada fila de entrada:
MATCH p = ANY SHORTEST
(src:Person)-[:knows]->{1,4}(dst:Person)
RETURN src.id AS sourceId, dst.id AS targetId, path_length(p) AS hopCount
ORDER BY sourceId, targetId
LIMIT 100
Si varios caminos se vinculan para la longitud más corta, la consulta devuelve uno de ellos, pero cuál camino ligado se devuelve no es determinista. Una cota inferior de cero puede devolver un camino de cero salto desde un nodo fuente hacia sí mismo.
ALL SHORTEST Y ANY las búsquedas de rutas no están soportadas.
Coloca predicados antes o después de la selección de caminos
La colocación de predicados determina si una condición define caminos elegibles o filtra caminos después de que el prefijo de búsqueda de caminos los haya seleccionado:
- Un patrón
WHEREen línea en un nodo o arista forma parte del patrón. Limita qué caminos son elegibles antesALLoANY SHORTESTqué se aplican. - Un nivel
WHEREde sentencia después del patrón completoMATCHes un filtro de postfiltro. Filtra las filas después de que el prefijo de búsqueda de caminos haya seleccionado caminos. - Una instrucción posterior
FILTERtambién filtra las filas tras la selección de caminos.
Esta distinción es especialmente importante con ANY SHORTEST. En el siguiente patrón, solo knows las aristas creadas en o después de la fecha especificada son elegibles cuando la consulta selecciona el camino más corto:
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')
-[connection:knows
WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z')]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
RETURN p
Mover la condición de borde a un filtro de poste cambia el significado. La consulta selecciona primero el camino más corto sin esa condición. Luego elimina el camino seleccionado si alguna arista no cumple la condición; no selecciona un camino más largo en su lugar:
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')
-[connections:knows]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
FILTER ALL(connection IN connections
WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z'))
RETURN p
Importante
Para algunas ANY SHORTEST formas de consulta, Graph puede aplicar actualmente una condición a nivel MATCH ... WHERE de instrucción antes de la selección de camino. Hasta que se resuelva esta limitación, utiliza predicados en línea para la elegibilidad de camino y una instrucción separada FILTER para filtrar tras la selección. Para obtener más información, consulte Limitaciones actuales.
Uso de patrones de longitud variable
Los patrones de longitud variable son construcciones eficaces que permiten encontrar rutas de longitud variable sin escribir especificaciones de patrones repetitivas. Son esenciales para recorrer jerarquías, redes sociales y otras estructuras en las que no se conoce con antelación la longitud óptima de la ruta de acceso.
Patrones de longitud variable delimitados
Muchas consultas de grafos comunes requieren repetir el mismo patrón perimetral varias veces. En lugar de escribir patrones detallados como:
(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)
Puede usar la sintaxis de longitud variable más concisa:
(:Person)-[:knows]->{3}(:Person)
{3} especifica que el -[:knows]-> patrón de borde debe repetirse exactamente tres veces.
Intervalos de repetición flexibles: Para obtener más flexibilidad, puede especificar un límite inferior y un límite superior para la repetición:
(:Person)-[:knows]->{1, 3}(:Person)
Este patrón busca amigos directos, amigos de amigos y amigos de amigos de amigos en una sola consulta.
Nota:
La cota inferior también puede ser cero. Una coincidencia de cero salto no contiene aristas y requiere que ambos patrones de nodos finales coincidan con el mismo nodo.
Ejemplo:
(p1:Person)-[:knows]->{0,1}(p2:Person)
Este patrón coincide con cada persona tanto p1p2 como en saltos cero, y en pares conectados en un salto.
Cuando no se especifica un límite inferior en {,n}, por defecto se reduce a cero.
Composiciones complejas de longitud variable: Los patrones de longitud variable pueden formar parte de patrones más grandes y complejos, como en la siguiente consulta:
MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
(c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100
El patrón encuentra pares de comentarios donde personas que se conocen dieron me gusta a diferentes comentarios y un mensaje m está conectado a cada comentario mediante una cadena de uno a tres replyOf bordes.
Enlazar variables perimetrales de patrón de longitud variable
Al enlazar un patrón de borde de longitud variable, el valor y el tipo de la variable perimetral cambian en función del contexto de referencia. Comprender este comportamiento es fundamental para procesar correctamente las coincidencias de longitud variable:
Dos grados de referencia:
- Dentro de un patrón de longitud variable: las variables perimetrales del grafo se enlazan a cada borde individual a lo largo de la ruta de acceso coincidente (también denominada "grado de referencia singleton")
- Fuera de un patrón de longitud variable: las variables perimetrales del grafo se enlazan a la secuencia de todos los bordes a lo largo de la ruta de acceso coincidente (también denominada "grado de referencia de grupo")
Ejemplo que muestra ambos contextos:
MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100
La evaluación de la variable e perimetral se produce en dos contextos:
En la
MATCHdeclaración: La consulta busca cadenas de amigos de amigos de amigos donde cada amistad se estableció desde el año 2000. Durante la coincidencia de patrones, el predicadoe.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")de patrón perimetral se evalúa una vez para cada borde candidato. En este contexto,eestá enlazado a un único valor de referencia perimetral.En la
RETURNinstrucción : aquí,eestá enlazada a una lista (grupo) de valores de referencia perimetral en el orden en que se producen en la cadena coincidente. El resultado de es el primer valor dee[0]referencia perimetral de cada cadena coincidente.
Variables de contorno de patrón de longitud variable en agregación horizontal:
Las variables de aristas limitadas por la correspondencia de patrones de longitud variable son listas de grupos fuera del patrón de longitud variable y, por tanto, pueden usarse en agregación horizontal.
MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100
Para más información, véase Funciones agregadas.
Patrones de longitud variable sin enlazar
Utiliza un cuantificador no acotado cuando no se conoce la longitud máxima del camino:
-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)
Los * atajos y + especifican cero o más y una o más repeticiones:
-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)
-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)
Un patrón ilimitado con la combinación por defecto ALL WALK se rechaza porque los ciclos pueden producir infinitos caminos coincidentes. Usar TRAIL, SIMPLE, o ACYCLIC para limitar el camino a través de la unicidad de aristas o nodos. Estos modos garantizan la terminación, pero un grafo grande aún puede producir un gran número de caminos.
Importante
Para un camino limitado por un no acotado ANY SHORTEST WALK, los únicos usos soportados son PATH_LENGTH(path) y, junto a él, path IS NULL. Graf no materializa el camino completo en esta forma. Usar una cota superior finita o especificar TRAIL, SIMPLE, o ACYCLIC para devolver o usar de otra forma el camino.