Escrever consultas GQL comuns 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.

Este artigo fornece padrões práticos de consulta GQL para tarefas comuns de grafos no Microsoft Fabric: encontrar vizinhos, percorrer ligações multisaltos, identificar ligações partilhadas, contar relações e encontrar entidades sem ligações.

Exemplos utilizam o conjunto de dados de amostras das redes sociais. Para referência completa de linguagem, consulte o guia de 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.

Encontre vizinhos diretos

Devolva todos os nós ligados a um nó inicial dentro de um único salto.

Encontra todas as pessoas que uma pessoa específica conhece:

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

Encontre todas as empresas onde trabalhou:

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

Encontrar amigos de amigos (multi-hop)

Use padrões de comprimento variável com {min,max} para atravessar mais de um salto.

Encontra pessoas a dois passos de distância – amigos dos amigos da Alice que a Alice não conhece diretamente:

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

Encontre todos acessíveis num raio de três graus:

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

Tip

Defina sempre um limite superior para a travessia de comprimento variável. Padrões ilimitados em grafos grandes ou densos podem atingir limites de tempo de espera de consulta. Ver Limitações atuais.

Contar relações por entidade

Use GROUP BY com count(*) para contar quantas relações cada entidade tem.

Conte quantos amigos cada pessoa tem, ordenados do maior ao pouco:

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

Conte quantos colaboradores trabalham em cada empresa:

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

Encontre ligações partilhadas

Reaproveitar uma variável em duas partes de um padrão cria uma restrição implícita de "nó idêntico". Use esta restrição para encontrar entidades ligadas através de uma terceira entidade partilhada.

Encontre pares de pessoas que conheçam a mesma pessoa:

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

Encontre pares de pessoas que trabalham na mesma 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

Tip

A WHERE a.id < b.id condição impede que pares duplicados (Alice–Bob e Bob–Alice) apareçam nos resultados.

Encontre entidades sem relações

Use OPTIONAL MATCH seguido de uma verificação nula para encontrar nós que não tenham relação de correspondência.

Encontre pessoas que não trabalhem em nenhuma empresa:

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

Encontre publicações sem comentários:

MATCH (post:Post)
OPTIONAL MATCH (comment:Comment)-[:replyOf]->(post)
FILTER comment IS NULL
RETURN post.id, post.content
LIMIT 100

Encontre entidades com muitas ligações

Combinar GROUP BY e FILTER para identificar nós altamente conectados. Este método é útil para encontrar hubs ou outliers.

Encontre pessoas com mais 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 Depois GROUP BY funciona como HAVING em SQL. Filtra pelo resultado agregado, não pelas linhas individuais.