Escritura de consultas GQL comunes en Microsoft Fabric

Note

Esta característica actualmente está en su versión preliminar pública. Esta versión preliminar se ofrece sin un contrato de nivel de servicio y no es aconsejable usarla para cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios para las versiones preliminares de Microsoft Azure.

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.

Los ejemplos usan el conjunto de datos de ejemplo de red social. Para obtener referencia completa del lenguaje, consulte la guía del lenguaje GQL.

Prerequisites

  • Un elemento de grafo con datos cargados. Si no está familiarizado con el grafo, complete primero el tutorial .
  • Familiaridad con las consultas básicas MATCH y RETURN . Consulte la guía del lenguaje GQL.

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 a la gente dos saltos lejos - amigos de los amigos de Alice que Alice no conoce directamente:

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

Sugerencia

Establezca siempre un límite superior en el recorrido de longitud variable. Los patrones no acotados en gráficos grandes o densos pueden superar los límites de tiempo de espera de consulta. Consulte Limitaciones actuales.

Recuento de relaciones por entidad

Use GROUP BY con count(*) para contar cuántas relaciones tiene cada entidad.

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

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

Contar cuántos empleados trabajan en cada empresa:

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, count(*) AS employeeCount
GROUP BY companyName
ORDER BY employeeCount DESC

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

Use OPTIONAL MATCH seguido de una comprobación nula para buscar nodos que no tengan ninguna relación coincidente.

Encuentre personas que no trabajan en ninguna empresa:

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100

Buscar publicaciones sin comentarios:

MATCH (post:Post)
OPTIONAL MATCH (comment:Comment)-[:replyOf]->(post)
FILTER comment IS NULL
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 name = p.firstName || ' ' || p.lastName
RETURN name, count(*) AS friendCount
GROUP BY 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.