Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.
Os exemplos utilizam o conjunto de dados de amostras das redes sociais. Para uma explicação de ponta a ponta do fluxo de consultas e das sentenças, consulte o guia da linguagem GQL. Use este artigo quando souber qual a tarefa de gráficos que pretende realizar. Para instruções sistemáticas sobre a construção de padrões de nós, arestas e caminhos, veja Escrever consultas de padrões de grafo. Para fluxos de trabalho detalhados de filtragem e agregação, veja Filtrar e agregar dados de gráficos.
Pré-requisitos
- Um item de grafo construído a partir do conjunto de dados de amostra de redes sociais, com os tipos de nós, tipos de arestas e propriedades descritos no exemplo do esquema da rede social.
- Familiaridade com consultas básicas
MATCHeRETURN. 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.
Encontre pessoas alcançadas exatamente por duas knows extremidades de Alice:
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
Encontre um dos caminhos mais curtos de Alice até cada pessoa alcançável em até quatro saltos:
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, path_length(p) AS hopCount
ORDER BY hopCount, dst.lastName
LIMIT 100
Se vários caminhos mais curtos chegarem à mesma pessoa com o mesmo número de saltos, ANY SHORTEST devolve um deles sem um critério de desempate determinístico.
Predicados em linha restringem quais caminhos são elegíveis para ANY SHORTEST.
Postfiltros aplicam-se depois de selecionar o caminho mais curto. Para exemplos, veja Colocar predicados antes ou depois da seleção de caminhos.
Tip
Use um limite superior finito para o custo de consulta previsível. O percurso sem limites ALL WALK não é suportado. Outros modos de caminho ilimitado ainda podem produzir resultados grandes.
Ver Limitações atuais.
Contar relações por entidade
Use GROUP BY com count(*) para contar quantas relações cada entidade tem.
Para agrupamento detalhado, filtragem agregada e padrões de roteamento condicional, veja Filtrar e agregar dados de grafos.
Conte quantos amigos cada pessoa tem, ordenados do maior ao pouco:
MATCH (p:Person)-[:knows]->(friend:Person)
LET personId = p.id, name = p.firstName || ' ' || p.lastName
RETURN personId, name, count(*) AS friendCount
GROUP BY personId, name
ORDER BY friendCount DESC
LIMIT 20
Calcule um valor para cada entidade
Use uma subconsulta correlacionada CALL para calcular um valor para cada linha de entrada. As variáveis da consulta externa estão implicitamente disponíveis dentro da subconsulta.
Calcule o número de amigos para cada pessoa:
MATCH (p:Person)
CALL {
MATCH (p)-[:knows]->(friend:Person)
RETURN count(*) AS friendCount
}
RETURN p.firstName, p.lastName, friendCount
ORDER BY friendCount DESC
As variáveis externas permanecem disponíveis após CALL. Das variáveis criadas dentro da subconsulta, apenas as colunas retornadas ficam disponíveis fora dela. Um elemento não agrupado count(*) retorna 0 quando não existem amigos que correspondam, pelo que esta consulta preserva as pessoas que não têm amigos.
Ordinary CALL elimina uma linha externa quando a subconsulta não devolve linhas e produz uma linha de saída por cada linha da subconsulta quando devolve várias linhas. Utilize OPTIONAL CALL quando precisar de preservar uma linha externa que não tenha uma linha correspondente na subconsulta.
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 NOT EXISTS para encontrar nós para os quais uma subconsulta correlacionada não retorna linhas.
Encontre pessoas que não trabalhem em nenhuma empresa:
MATCH (p:Person)
WHERE NOT EXISTS {
MATCH (p)-[:workAt]->(c:Company)
RETURN c
}
RETURN p.firstName, p.lastName
LIMIT 100
Encontre publicações sem comentários:
MATCH (post:Post)
WHERE NOT EXISTS {
MATCH (comment:Comment)-[:replyOf]->(post)
RETURN comment
}
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 personId = p.id, name = p.firstName || ' ' || p.lastName
RETURN personId, name, count(*) AS friendCount
GROUP BY personId, 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.