Escritura de consultas GQL comunes en Microsoft Fabric

En este artículo se proporcionan patrones prácticos de consulta de GQL para tareas comunes de grafos en Microsoft Fabric: buscar vecinos, atravesar conexiones multihop, identificar conexiones compartidas, contar relaciones y buscar entidades sin conexiones.

En los ejemplos se usa el conjunto de datos de ejemplo de red social. Para una explicación de extremo a extremo del flujo de consultas y las sentencias, consulte la guía del lenguaje GQL. Utiliza este artículo cuando sepas qué tarea de grafos quieres realizar. Para instrucciones sistemáticas sobre la construcción de patrones de nodos, aristas y caminos, véase Escribir consultas de patrones de grafos. Para flujos de trabajo detallados de filtrado y agregación, véase Filtrar y agregar datos de grafos.

Prerequisites

Buscar vecinos directos

Devuelve todos los nodos conectados a un nodo inicial mediante un salto.

Encuentre a todos los usuarios que conoce una persona específica:

MATCH (p:Person WHERE p.firstName = 'Alice')-[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName

Encuentre todas las empresas en las que trabajó una persona:

MATCH (p:Person WHERE p.firstName = 'Alice')-[:workAt]->(c:Company)
RETURN c.name, c.url

Descubrir amigos de amigos (conexiones múltiples)

Utilice patrones de longitud variable con {min,max} para recorrer varios saltos.

Encuentra personas alcanzadas exactamente por dos knows bordes de Alicia:

MATCH (alice:Person WHERE alice.firstName = 'Alice')-[:knows]->{2,2}(fof:Person)
RETURN DISTINCT fof.firstName, fof.lastName
LIMIT 100

Encuentre a todas las personas que sean alcanzables en tres grados:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,3}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100

Encuentra un camino más corto desde Alice hasta cada persona a la que se pueda llegar en un máximo de cuatro saltos:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, path_length(p) AS hopCount
ORDER BY hopCount, dst.lastName
LIMIT 100

Si varios caminos más cortos llegan a la misma persona en el mismo número de saltos, ANY SHORTEST uno de ellos regresa sin una elección de empate determinista.

Los predicados en línea limitan qué caminos son elegibles para ANY SHORTEST. Los postfiltros se aplican después de que se seleccione la ruta más corta. Para ejemplos, véase Colocar predicados antes o después de la selección de caminos.

Sugerencia

Utiliza un límite superior finito para el coste predecible de consulta. No se permite el desplazamiento ilimitado ALL WALK . Otros modos de ruta no acotados siguen pudiendo producir resultados muy extensos. Consulte Limitaciones actuales.

Recuento de relaciones por entidad

Use GROUP BY con count(*) para contar cuántas relaciones tiene cada entidad. Para patrones detallados de agrupación, filtrado agregado y enrutamiento condicional, véase Filtrar y agregar datos de grafos.

Cuente cuántos amigos tiene cada persona, ordenados de la mayoría a los más pocos:

MATCH (p:Person)-[:knows]->(friend:Person)
LET personId = p.id, name = p.firstName || ' ' || p.lastName
RETURN personId, name, count(*) AS friendCount
GROUP BY personId, name
ORDER BY friendCount DESC
LIMIT 20

Calcula un valor para cada entidad

Utiliza una subconsulta correlacionada CALL para calcular un valor para cada fila de entrada. Las variables de la consulta externa están implícitamente disponibles dentro de la subconsulta.

Calcula el número de amigos para cada persona:

MATCH (p:Person)
CALL {
  MATCH (p)-[:knows]->(friend:Person)
  RETURN count(*) AS friendCount
}
RETURN p.firstName, p.lastName, friendCount
ORDER BY friendCount DESC

Las variables externas permanecen disponibles después de CALL. De las variables creadas dentro de la subconsulta, solo las columnas devueltas quedan disponibles fuera de ella. Un count(*) sin agrupar devuelve 0 cuando no existe ningún amigo coincidente, por lo que esta consulta conserva a las personas que no tienen amigos.

Ordinario CALL elimina una fila exterior cuando la subconsulta no devuelve filas y produce una fila de salida para cada subfila de consulta cuando devuelve varias filas. Usa OPTIONAL CALL cuando necesites conservar una fila externa que no tenga ninguna fila de la subconsulta correspondiente.

Búsqueda de conexiones compartidas

La reutilización de una variable en dos partes de un patrón crea una restricción implícita de "mismo nodo". Use esta restricción para buscar entidades conectadas a través de una tercera entidad compartida.

Buscar pares de personas que conocen a la misma persona:

MATCH (a:Person)-[:knows]->(mutual:Person)<-[:knows]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, mutual.firstName AS sharedContact
LIMIT 100

Buscar pares de personas que trabajan en la misma empresa:

MATCH (c:Company)<-[:workAt]-(a:Person), (c)<-[:workAt]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, c.name AS company
LIMIT 100

Sugerencia

La WHERE a.id < b.id condición impide que los pares duplicados (Alice–Bob y Bob–Alice) aparezcan en los resultados.

Búsqueda de entidades sin relaciones

Úsase NOT EXISTS para encontrar nodos para los que una subconsulta correlacionada no devuelva filas.

Encuentre personas que no trabajan en ninguna empresa:

MATCH (p:Person)
WHERE NOT EXISTS {
  MATCH (p)-[:workAt]->(c:Company)
  RETURN c
}
RETURN p.firstName, p.lastName
LIMIT 100

Buscar publicaciones sin comentarios:

MATCH (post:Post)
WHERE NOT EXISTS {
  MATCH (comment:Comment)-[:replyOf]->(post)
  RETURN comment
}
RETURN post.id, post.content
LIMIT 100

Búsqueda de entidades con muchas conexiones

Combine GROUP BY e FILTER identifique nodos altamente conectados. Este método es útil para encontrar nodos centrales o valores atípicos.

Encuentra personas con más de 10 amigos:

MATCH (p:Person)-[:knows]->(friend:Person)
LET personId = p.id, name = p.firstName || ' ' || p.lastName
RETURN personId, name, count(*) AS friendCount
GROUP BY personId, name
FILTER friendCount > 10
ORDER BY friendCount DESC

Note

FILTER después de GROUP BY funciona como HAVING en SQL. Filtra el resultado agregado, no las filas individuales.