Gravar consultas GQL comuns em Microsoft Fabric

Este artigo fornece padrões práticos de consulta GQL para tarefas comuns de grafo em Microsoft Fabric: localizar vizinhos, percorrer conexões multihop, identificar conexões compartilhadas, contar relações e localizar entidades sem conexões.

Os exemplos usam o conjunto de dados de exemplo de rede social. Para obter referência de linguagem completa, consulte o guia de linguagem GQL.

Pré-requisitos

  • Um item de grafo com dados carregados. Se você não estiver familiarizado com o grafo, conclua o tutorial primeiro.
  • Familiaridade com MATCH e RETURN consultas básicas. Consulte o guia de linguagem GQL.

Localizar vizinhos diretos

Retorne todos os nós conectados a um nó inicial por meio de um salto.

Encontre todos que uma pessoa específica conheça:

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

Encontre todas as empresas em que uma pessoa trabalhou:

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

Encontrar amigos de amigos (vários saltos)

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

Encontre pessoas a dois saltos de distância - amigos dos amigos de Alice que 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 dentro de três graus:

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

Dica

Sempre defina um limite superior na passagem de comprimento variável. Padrões não associados em grafos grandes ou densos podem atingir limites de tempo limite de consulta. Confira as 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 da maioria para o menor:

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 funcionários 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

Localizar conexões compartilhadas

Reutilizando uma variável em duas partes de um padrão cria uma restrição implícita de "mesmo nó". Use essa restrição para localizar entidades conectadas por meio de uma terceira entidade compartilhada.

Encontre pares de pessoas que conhecem 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

Dica

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

Localizar entidades sem relações

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

Encontre pessoas que não trabalham em nenhuma empresa:

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

Localize postagens sem comentários:

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

Localizar entidades com muitas conexões

Combine GROUP BY e FILTER para identificar nós altamente conectados. Esse método é útil para localizar hubs ou exceções.

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 após GROUP BY funciona como HAVING em SQL. Ele filtra o resultado agregado, não as linhas individuais.