Gravar consultas de padrão de grafo no Microsoft Fabric

Note

Esse recurso está atualmente em versão prévia pública. Essa versão prévia é oferecida sem um Acordo de Nível de Serviço (SLA) e não é recomendada para cargas de trabalho em nível de produção. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares para Versões Prévias do Microsoft Azure.

A correspondência de padrões de grafo permite descrever a estrutura dos dados que você deseja encontrar usando sintaxe visual intuitiva. Em vez de unir tabelas, você escreve padrões que se parecem com as próprias relações - nós conectados por bordas. Este artigo mostra como escrever consultas de padrão GQL para cenários comuns no grafo em Microsoft Fabric.

Os exemplos usam o conjunto de dados de exemplo de rede social. Para uma referência completa da sintaxe de padrões, consulte padrões de grafo 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.

Relacionar relações diretas

Um padrão básico corresponde a um tipo de nó, um tipo de borda específico e outro tipo de nó. A sintaxe se parece com um diagrama da relação.

Por exemplo, para encontrar até 100 pessoas emparelhadas com a empresa em que trabalham:

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

Use um padrão de borda não redirecionado quando você não souber ou não se importar com a direção. Por exemplo, para encontrar até 100 conhecidos mútuos, independentemente de quem iniciou a conexão:

MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100

Note

Atualmente, o grafo não dá suporte à criação de bordas não indiretas, mas você pode consultar bordas em qualquer direção usando -[:label]- a sintaxe.

Filtrar padrões com WHERE integrado

Coloque WHERE dentro do padrão para filtrar nós e bordas conforme eles são correspondidos. Essa abordagem é mais eficiente do que filtrar após o fato.

Por exemplo, para encontrar pessoas nascidas antes de 1990 que trabalham em uma empresa cujo nome começa com 'A':

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

Filtre as propriedades de borda para restringir quais relações correspondem. Por exemplo, para retornar somente as pessoas que começaram a trabalhar em uma empresa em 2010 ou depois:

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

Corresponder relações de vários saltos

Use padrões de comprimento variável para percorrer vários saltos em uma expressão. Especifique o número mínimo e máximo de saltos com a sintaxe {min,max}.

Por exemplo, para encontrar até 100 pessoas acessíveis dentro de dois a quatro graus de amizade de Alice:

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

Para encontrar até 100 conexões imediatas e de segundo grau (um ou dois saltos) de Alice:

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

Controle de travessia com modos de caminho

Por padrão, o GQL usa o modo TRAIL, que impede que a mesma borda seja percorrida mais de uma vez. Use os modos de caminho explicitamente quando precisar de garantias diferentes.

Modo de percurso Behavior Use quando…
WALK Permite nós e bordas repetidos Você quer percurso bruto sem restrições. Raramente necessário; principalmente útil para consultas exploratórias.
TRAIL Nenhuma borda repetida (padrão) Você deseja evitar repetir a mesma relação, mas o mesmo nó pode aparecer por meio de relações diferentes. Funciona bem para a maioria das consultas de passagem.
SIMPLE Nenhum nó repetido, exceto o início e o fim Você deseja que nenhum nó apareça mais de uma vez no meio de um caminho, mas permita caminhos que se fechem de volta ao início. Útil para detectar loops.
ACYCLIC Nenhum nó repetido de forma alguma Você precisa garantir que nenhum dos nós apareça no caminho mais de uma vez. O uso para hierarquias estritas, linhagem ou qualquer passagem em que revisitar um nó produziria resultados incorretos.

WALK é o modo mais permissivo e ACYCLIC é o mais restritivo. TRAIL é o padrão e funciona bem para a maioria das consultas. Use um modo mais restritivo somente quando o caso de uso exigir.

Para ilustrar a diferença, considere o percurso Alice → Bob → Carol → Bob:

  • WALK – permite esse caminho. Nodos e arestas podem ser repetidos livremente.
  • TRAIL – permite esse caminho. Bob aparece duas vezes, mas cada borda usada é uma relação diferente (Alice→Bob e Carol→Bob são bordas distintas), portanto, nenhuma borda é repetida.
  • SIMPLE – bloqueia esse caminho. Bob aparece mais de uma vez, e "SIMPLE" só permite que um nó se repita se esse mesmo nó for o início e o fim do caminho (um ciclo fechado). Aqui alice é o início e Bob é o fim, então nenhuma exceção se aplica.
  • ACYCLIC – bloqueia esse caminho. Bob aparece mais de uma vez em qualquer lugar no caminho.

O exemplo a seguir mostra como usar TRAIL para contar quantos caminhos distintos levam a cada uma das 100 primeiras pessoas acessíveis na rede de Alice em quatro saltos:

MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, count(*) AS pathCount
LIMIT 100

Utilize ACYCLIC para retornar até 100 pessoas alcançáveis a partir de Alice dentro de quatro saltos, onde cada pessoa no caminho é única.

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

Dica

Para grafos grandes, sempre defina um limite superior em padrões de comprimento variável ({1,4} em vez de {1,}). A travessia ilimitada entre grafos densos pode atingir os limites de tempo de consulta. Confira as limitações atuais.

Usar a reutilização de variável para expressar entidades compartilhadas

Reutilização da mesma variável em duas partes de um padrão cria uma restrição de igualdade implícita – ambas as referências devem corresponder ao mesmo nó. Essa técnica permite que você expresse "localizar entidades conectadas por meio de uma terceira entidade compartilhada".

Por exemplo, para encontrar até 100 pares de pessoas que se conhecem e trabalham na mesma empresa:

MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100

A variável c é reutilizada para ambos os workAt alvos, portanto, a consulta retorna apenas pares em que ambas as pessoas se conhecem e trabalham na mesma empresa.

Para encontrar até 100 pares de pessoas que gostaram do mesmo post:

MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100

Dica

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

Combinar vários padrões

Listar vários padrões em um único MATCH, separados por vírgulas. Todos os padrões devem compartilhar pelo menos uma variável para que se unam corretamente.

Por exemplo, para encontrar até 100 pessoas, juntamente com seu local de trabalho e a cidade em que vivem:

MATCH (p:Person)-[:workAt]->(c:Company),
      (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100

A variável p compartilhada conecta os dois padrões. Cada linha de resultado representa uma pessoa com sua empresa e cidade.

Associar relações opcionais

Use OPTIONAL MATCH quando uma relação pode não existir para cada nó. As linhas sem correspondência são retidas com NULL valores, semelhantes a um SQL LEFT JOIN.

Por exemplo, retorne até 100 pessoas com o nome da empresa, incluindo pessoas sem empregador (ou seja, que retornam NULL para a coluna da empresa):

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100

Use IS NULL depois OPTIONAL MATCH para encontrar até 100 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