Filtrar e agregar dados de grafos no Microsoft Fabric

Note

Esta funcionalidade está atualmente em pré-visualização pública. Esta pré-visualização é fornecida sem estar sujeita a um acordo de nível de serviço e não é adequada para cargas de trabalho de produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para mais informações, consulte Termos Suplementares de Utilização para Microsoft Azure Previews.

Filtrar restringe os resultados às linhas que importam. A agregação resume essas linhas em contagens, totais e médias. Este artigo mostra-lhe como aplicar ambas as técnicas em consultas GQL contra grafos no Microsoft Fabric.

Exemplos utilizam o conjunto de dados de amostras das redes sociais. Para uma referência completa das instruções e expressões GQL, consulte o guia da linguagem GQL.

Pré-requisitos

  • Um item de grafo com dados carregados. Se és novo no Graph, faz primeiro o tutorial .
  • Familiaridade com consultas básicas MATCH e RETURN. Consulte o guia de linguagem GQL.

Filtre linhas com o FILTER

Use FILTER para manter apenas as linhas que cumpram uma condição. Coloque FILTER depois MATCH para reduzir os resultados correspondentes.

A seguinte consulta devolve todas as mulheres com o seu nome e data de nascimento:

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

Combinem múltiplas condições com AND e OR. Por exemplo, a consulta seguinte devolve os nomes de todas as mulheres nascidas antes de 1990:

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

Tip

Para um melhor desempenho, durante a correspondência de padrões, filtre utilizando uma cláusula inline WHERE em vez de uma instrução separada FILTER. Veja Filtro durante a correspondência de padrões.

Filtro durante a correspondência de padrões

As cláusulas em linha WHERE dentro de um padrão MATCH restringem quais nós e arestas são correlacionados antes de serem produzidos quaisquer resultados. Esta abordagem é mais eficiente do que uma cláusula pós-correspondência FILTER porque o motor de consulta elimina as linhas mais cedo.

Por exemplo, para encontrar pessoas nascidas antes de 1994 juntamente com a empresa onde trabalham, limitando os resultados a empresas cujo nome começa 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

As propriedades das bordas do filtro são da mesma forma. Por exemplo, para devolver apenas pessoas que começaram a trabalhar numa empresa em 2000 ou depois:

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

Para saber mais sobre a diferença de desempenho entre filtragem inline e pós-match, consulte Otimizar o desempenho das consultas GQL.

Lidar com valores nulos em filtros

O GQL utiliza lógica de três valores: os predicados avaliam até TRUE, FALSE, ou UNKNOWN. Quando o valor de uma propriedade é nulo, as comparações retornam UNKNOWN. FILTER trata UNKNOWN como não combinando, por isso a linha é excluída.

Use IS NULL e IS NOT NULL para testar valores nulos explicitamente:

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

Use coalesce() para substituir um valor padrão quando uma propriedade pode ser nula:

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

Atenção

NULL = NULL avalia-se como UNKNOWN, não TRUE. Use sempre IS NULL para testar valores nulos, não igualdade.

Resultados agregados com RETURN

Utilize funções agregadas em RETURN para resumir os seus resultados. GQL suporta count(), sum(), avg(), min(), e max().

Por exemplo, para contar todas as pessoas no gráfico:

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

Para contar valores distintos, como quantas empresas distintas empregam pessoas:

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

Agrupar resultados com GROUP BY

Use GROUP BY em RETURN para agrupar linhas por valores comuns e calcular agregados em cada grupo. Este agrupamento é o equivalente GQL ao SQL GROUP BY.

Por exemplo, para contar os funcionários 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 várias colunas e calcule vários agregados ao mesmo tempo. Por exemplo, divida o número de pessoas e o intervalo de datas de nascimento por género e browser, retornando as 10 combinações mais comuns:

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 as expressões não agregadas em RETURN devem aparecer em GROUP BY. Expressões que não estão em GROUP BY têm de usar uma função agregada.

Ordenar e limitar os resultados agregados

Use ORDER BY e LIMIT junto com GROUP BY para encontrar resultados top-N.

Por exemplo, para encontrar as cinco principais cidades por número de habitantes:

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 LIMITde . LIMIT aplica-se sempre ao conjunto de resultados já ordenado.

Use CASE para valores condicionais em resultados

Use CASE/WHEN/THEN/ELSEpara calcular valores condicionais em RETURN ou .LET

Por exemplo, categorizar as pessoas em eras com base no ano de nascimento:

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