Filtrar y agregar datos de grafos 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.

El filtrado limita los resultados a las filas que importan. La agregación resume esas filas en recuentos, totales y promedios. En este artículo se muestra cómo aplicar ambas técnicas en consultas GQL contra el gráfico de Microsoft Fabric.

Los ejemplos usan el conjunto de datos de ejemplo de red social. Para obtener una referencia completa de las instrucciones y expresiones de GQL, 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 de MATCH y RETURN básicas. Consulte la guía del lenguaje GQL.

Filtrar filas con FILTER

Use FILTER para mantener solo las filas que cumplen una condición. Coloque FILTER después de MATCH para restringir los resultados coincidentes.

La consulta siguiente devuelve todas las mujeres con su nombre y cumpleaños:

MATCH (p:Person)
FILTER p.gender = 'female'
RETURN p.firstName, p.lastName, p.birthday

Combine varias condiciones con AND y OR. Por ejemplo, la consulta siguiente devuelve los nombres de todas las mujeres nacidas antes de 1990:

MATCH (p:Person)
FILTER p.gender = 'female' AND p.birthday < 19900101
RETURN p.firstName, p.lastName

Sugerencia

Para lograr un mejor rendimiento, durante la evaluación de patrones, filtre con una cláusula en línea WHERE en lugar de una instrucción independiente FILTER. Consulte Filtro durante la coincidencia de patrones.

Filtrar durante la coincidencia de patrones

Las cláusulas integradas WHERE dentro de un patrón MATCH restringen qué nodos y aristas se corresponden antes de que se produzcan resultados. Este enfoque es más eficaz que una cláusula de coincidencia posterior FILTER porque el motor de consultas recorta filas más temprano.

Por ejemplo, para buscar personas nacidas antes de 1994 junto con la empresa donde trabajan, limitando los resultados a las empresas cuyo nombre comienza por "A":

MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name

Filtre las propiedades perimetrales de la misma manera. Por ejemplo, para devolver únicamente a las personas que comenzaron a trabajar en una empresa en 2000 en adelante:

MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)
RETURN p.firstName, p.lastName, c.name, w.workFrom

Para obtener más información sobre la diferencia de rendimiento entre el filtrado insertado y posterior a la coincidencia, consulte Optimización del rendimiento de las consultas GQL.

Manejo de valores NULL en filtros

GQL usa lógica con tres valores: los predicados se evalúan como TRUE, FALSEo UNKNOWN. Cuando un valor de propiedad es NULL, las comparaciones devuelven UNKNOWN. FILTER trata UNKNOWN como no coincidente, por lo que se excluye la fila.

Use IS NULL y IS NOT NULL para probar los valores NULL explícitamente:

-- Only include people who have a nickname
MATCH (p:Person)
FILTER p.nickname IS NOT NULL
RETURN p.firstName, p.nickname

Use coalesce() para sustituir un valor predeterminado cuando una propiedad podría ser NULL:

MATCH (p:Person)
RETURN p.firstName, coalesce(p.nickname, p.firstName) AS displayName

Caution

NULL = NULL se evalúa como UNKNOWN, no TRUE. IS NULL Use siempre para probar los valores NULL, no para la igualdad.

Agregar resultados con la función RETURN

Use funciones de agregado en RETURN para resumir los resultados. GQL admite count(), sum(), avg(), min() y max().

Por ejemplo, para contar todas las personas del gráfico:

MATCH (p:Person)
RETURN count(*) AS totalPeople

Para contar valores distintos, como el número de empresas distintas que emplean personas:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT c) AS companyCount

Agrupar resultados con GROUP BY

Usar GROUP BY en RETURN para agrupar filas por valores compartidos y calcular agregados dentro de cada grupo. Esta agrupación es el equivalente GQL de SQL GROUP BY.

Por ejemplo, para contar empleados por empresa:

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

Agrupe por varias columnas y calcule varios agregados a la vez. Por ejemplo, desglosa el número de personas y el intervalo de cumpleaños por género y explorador, devolviendo las 10 combinaciones más comunes:

MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
       browser,
       count(*) AS personCount,
       min(p.birthday) AS earliestBirthday,
       max(p.birthday) AS latestBirthday
GROUP BY gender, browser
ORDER BY personCount DESC
LIMIT 10

Note

Todas las expresiones no agregadas de RETURN deben aparecer en GROUP BY. Las expresiones que no están en GROUP BY deben usar una función de agregado.

Ordenar y limitar los resultados agregados

Use ORDER BY y LIMIT junto con GROUP BY para obtener los N mejores resultados.

Por ejemplo, para encontrar las cinco ciudades principales por número de residentes:

MATCH (p:Person)-[:isLocatedIn]->(city:City)
LET cityName = city.name
RETURN cityName, count(*) AS residentCount
GROUP BY cityName
ORDER BY residentCount DESC
LIMIT 5

Importante

Coloque ORDER BY antes de LIMIT. LIMIT siempre se aplica al conjunto de resultados ya ordenado.

Uso de CASE para valores condicionales en los resultados

Use CASE/WHEN/THEN/ELSEpara calcular valores condicionales en RETURN o .LET

Por ejemplo, para clasificar a las personas en eras en función de su año de nacimiento:

MATCH (p:Person)
RETURN p.firstName,
       CASE WHEN p.birthday < 19800101 THEN 'Before 1980'
            WHEN p.birthday < 20000101 THEN '1980–1999'
            ELSE '2000 or later'
       END AS era