Compartilhar via


Padrões de grafo GQL

Observação

Esse recurso está atualmente em versão prévia pública. Essa versão prévia é oferecida sem um SLA e não é recomendada para cargas de trabalho 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.

Os padrões de grafo são os principais blocos de construção de suas consultas GQL. Eles descrevem as estruturas que você está procurando no grafo usando nós e bordas de maneira intuitiva e visual. Pense em padrões de grafo como modelos que o mecanismo de consulta tenta corresponder aos dados reais em seu grafo.

Importante

Este artigo utiliza exclusivamente o conjunto de dados de exemplos de grafos de redes sociais.

Padrões de elemento simples

Padrões de elemento simples ajudam você a corresponder nós individuais e bordas do grafo que atendem a requisitos específicos. Esses padrões formam a base para correspondência de padrões mais complexa.

Padrões de nó simples

Um padrão de nó especifica os rótulos e as propriedades que um nó deve ter que corresponder:

(:City { name: "New York" })

Esse padrão corresponde a todos os nós que têm rótulos e Place rótulos City (indicados & pelo operador) e cuja name propriedade é "New York"igual a . Essa especificação de rótulos e propriedades necessários é chamada de preenchimento do padrão de nó.

Principais conceitos:

  • Correspondência de rótulos: use & para exigir vários rótulos.
  • Filtragem de propriedade: especifique os valores exatos que as propriedades devem corresponder.
  • Correspondência flexível ("covariante").: os nós correspondentes podem ter mais rótulos e propriedades além dos especificados.

Observação

Modelos de grafos com múltiplos elementos ainda não são suportados (problema conhecido).

Padrões de borda simples

Os padrões de borda são mais complexos do que os padrões de nó. Eles não só especificam um preenchimento, mas também conectam um padrão de nó de origem a um padrão de nó de destino. Os padrões de borda descrevem os requisitos na borda e em seus pontos de extremidade:

(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)

A direção da seta -[...]-> é importante, ela determina (:Person) como o padrão do nó de origem e (:Comment) como o padrão de nó de destino. Entender a direção da borda é crucial para consultar o grafo corretamente.

Padrão espelhado equivalente:

Você pode inverter a seta e trocar os padrões de nó para criar o padrão de borda espelhado equivalente:

(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)

Esse padrão encontra as mesmas relações, mas da perspectiva oposta.

Padrões de borda direcionados a qualquer

Quando a direção de uma borda de grafo não importa para sua consulta, você pode deixá-la não especificada criando um padrão de borda direcionado:

(:Song)-[:inspired]-(:Movie)

Esse padrão corresponde às mesmas bordas (:Song)-[:inspired]->(:Movie) que e (:Movie)-[:inspired]->(:Song) combinados, independentemente de qual nó é a origem e qual é o destino (este exemplo não é do tipo de grafo de rede social).

Atalhos de padrão de borda do grafo

O GQL fornece atalhos convenientes para padrões de borda comuns para tornar suas consultas mais concisas:

  • ()->() ()-[]->() significa (borda direcionada com qualquer rótulo)
  • ()<-() ()<-[]-() significa (borda direcionada ao contrário com qualquer rótulo)
  • ()-() ()-[]-() significa (qualquer borda direcionada com qualquer rótulo)

Esses atalhos podem ser úteis quando você se preocupa com a conectividade, mas não com o tipo de borda de grafo específico.

Expressões de rótulo

Os padrões podem expressar requisitos complexos nos rótulos de nós e bordas correspondentes.

Example:

MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches

Isso conta o número de isLocatedIn bordas que conectam Person nós ou Organizationnós (mas não)Company (que são sempre University nós no esquema de rede social) ou CityCountry nós.

Sintaxe:

Sintaxe Meaning
A&B Os rótulos precisam incluir A e B.
A|B Os rótulos precisam incluir pelo menos um de A ou B.
!A Os rótulos precisam excluir A.

Além disso, use parênteses para controlar a ordem da avaliação da expressão de rótulo. Por padrão, ! tem a precedência mais alta e & tem precedência maior que |. Portanto, !A&B|C|!D é o mesmo que ((!A)&B)|C|(!D).

Variáveis de associação

As variáveis permitem que você se refira a elementos de grafo correspondentes em outras partes da consulta. Entender como associar e usar variáveis é essencial para criar consultas avançadas.

Variáveis de elemento de associação

Os padrões de nó e de borda podem associar nós e bordas correspondentes a variáveis para referência posterior.

(p:Person)-[w:workAt]->(c:Company)

Nesse padrão, p é associado a nós correspondentes Person , w a bordas correspondentes workAt e c a nós correspondentes Company .

Reutilização de variável para restrições estruturais:

Reutilização da mesma variável em um padrão várias vezes expressa uma restrição na estrutura de correspondências. Cada ocorrência da mesma variável deve sempre se associar ao mesmo elemento de grafo em uma correspondência válida. A reutilização de variável é eficiente para expressar requisitos estruturais complexos.

(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

O padrão localiza nós e que se conhecem e funcionam no mesmoPerson, que está associado à variávelx.yCompanyc A reutilização garante c que ambas as pessoas trabalhem na mesma empresa.

Predicados de padrão com variáveis de elemento:

As variáveis de elemento de associação permitem que você especifique predicados de padrão de borda e nó. Em vez de apenas fornecer um preenchimento com valores de propriedade exatos como { name: "New York, USA" }, um preenchimento pode especificar um predicado que é avaliado para cada elemento candidato. O padrão só corresponde se o predicado for avaliado como TRUE:

(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)

O padrão de borda encontra pessoas que se conheciam desde 1º de janeiro de 2000, usando uma condição flexível em vez de uma correspondência exata.

Observação

As variáveis de padrão de borda sempre se associam à borda individual no predicado de padrão de borda, mesmo ao usar padrões de comprimento variável. Isso pode ajudar com a não necessidade de remover as variáveis de lista de grupos de borda para executar um pós-filtro. Consulte variáveis de borda de padrão de comprimento variável Bind.

Técnicas avançadas de predicado de padrão:

Predicados de padrão fornecem recursos avançados de filtragem embutida que podem melhorar a legibilidade da consulta:

-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.age > 30 AND p.department = 'Engineering')
      -[:workAt]->
      (c:Company WHERE c.revenue > 1000000 AND c.location = 'Seattle')

-- Complex edge predicates with calculations
MATCH (p1:Person)-[w:workAt WHERE w.start_date < ZONED_DATETIME('2020-01-01T00:00:00Z') 
                              AND w.salary > 75000]-(c:Company)

-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.active = TRUE AND c.public = TRUE

-- Filter during matching and after
MATCH (p:Person WHERE p.department = 'Sales')-[:workAt]->(c:Company)
WHERE p.quota_achievement > 1.2 AND c.revenue > c.revenue_target

Dica

Usar predicados de padrão quando as condições são altamente seletivas pode reduzir o tamanho dos resultados intermediários.

Variáveis de caminho de associação

Você também pode associar um caminho correspondente a uma variável de caminho para processamento adicional ou para retornar a estrutura de caminho completa ao usuário:

p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

Aqui, p está associado a um valor de caminho que representa a estrutura de caminho correspondente completa, incluindo valores de referência para todos os nós e bordas na ordem fornecida.

Caminhos limitados podem ser retornados ao usuário ou processados posteriormente usando funções como NODES ou EDGES:

MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges

Compor padrões

Consultas do mundo real geralmente exigem padrões mais complexos do que estruturas simples de nó-borda-nó. A GQL fornece várias maneiras de compor padrões para passagens de grafo sofisticadas.

Compor padrões de caminho

Os padrões de caminho podem ser compostos concatenando padrões simples de nó e borda para criar passagens mais longas.

(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

O padrão percorre de uma pessoa através de suas conexões sociais e profissionais para encontrar onde a empresa de seu colega está localizada.

Construção de padrão em forma de peça: Você também pode criar padrões de caminho de forma mais incremental, o que pode facilitar a leitura e a compreensão de padrões complexos:

(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Essa abordagem divide a mesma passagem em etapas lógicas, facilitando a compreensão e a depuração.

Compor padrões não lineares

A forma resultante de um padrão não precisa ser um caminho linear. Você pode corresponder a estruturas mais complexas, como padrões em forma de estrela, que radiam de um nó central:

(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)

O padrão localiza uma pessoa junto com suas preferências de educação, emprego e conteúdo de uma só vez, uma consulta de perfil abrangente.

Trilhas de correspondência

Em padrões complexos, muitas vezes é indesejável atravessar a mesma borda várias vezes. A reutilização de borda torna-se importante quando o grafo real contém ciclos que podem levar a caminhos infinitos ou excessivamente longos. Para lidar com a reutilização de borda, o graph no Microsoft Fabric dá suporte ao TRAIL modo de correspondência.

A prefixação de um padrão de caminho com a palavra-chave TRAIL descarta todas as correspondências que associam a mesma borda várias vezes:

TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)

Ao usar TRAIL, o padrão produz apenas correspondências nas quais todas as bordas são diferentes. Portanto, mesmo c = a que o caminho for formatar um ciclo em uma determinada correspondência, e3 nunca se associa à mesma borda que e1.

O TRAIL modo é essencial para evitar loops infinitos e garantir que suas consultas retornem caminhos significativos e não recorrentes.

Usar padrões de comprimento variável

Padrões de comprimento variável são construções poderosas que permitem encontrar caminhos de comprimentos variados sem escrever especificações de padrão repetitivo. Eles são essenciais para percorrer hierarquias, redes sociais e outras estruturas em que o comprimento ideal do caminho não é conhecido com antecedência.

Padrões de comprimento variável limitados

Importante

Atualmente, os padrões de comprimento variável limitados dão suporte apenas a um limite máximo superior de 8. Consulte o artigo sobre as limitações atuais.

Muitas consultas de grafo comuns exigem repetir o mesmo padrão de borda várias vezes. Em vez de escrever padrões detalhados como:

(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)

Você pode usar a sintaxe de comprimento variável mais concisa:

(:Person)-[:knows]->{3}(:Person)

Especifica {3} que o padrão de -[:knows]-> borda deve ser repetido exatamente três vezes.

Intervalos de repetição flexíveis: Para obter mais flexibilidade, você pode especificar um limite inferior e um limite superior para a repetição:

(:Person)-[:knows]->{1, 3}(:Person)

Esse padrão encontra amigos diretos, amigos de amigos e amigos de amigos de amigos em uma única consulta.

Observação

O limite inferior também pode ser 0. Nesse caso, nenhuma borda é correspondida e todo o padrão corresponde somente se e somente se os dois padrões de nó de ponto de extremidade corresponderem ao mesmo nó.

Exemplo:

(p1:Person)-[r:knows WHERE NOT p1=p2]->{0,1}(p2:Person)

Esse padrão combina com pares de pessoas diferentes que se conhecem, mas também corresponde à mesma pessoa que ambos p1 e p2 - mesmo que essa pessoa não "se conheça".

Quando nenhum limite inferior é especificado, geralmente o padrão é 0 (zero).

Composições complexas de comprimento variável: Padrões de comprimento variável podem fazer parte de padrões maiores e mais complexos, como na consulta a seguir:

MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
      (c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100

O padrão encontra pares de comentários em que as pessoas que se conhecem gostaram de comentários diferentes, e esses comentários são conectados por meio de cadeias de resposta de 1 a 5 níveis cada.

Associar variáveis de borda de padrão de comprimento variável

Quando você associa um padrão de borda de comprimento variável, o valor e o tipo da variável de borda mudam dependendo do contexto de referência. Entender esse comportamento é crucial para processar corretamente correspondências de comprimento variável:

Dois graus de referência:

  • Dentro de um padrão de comprimento variável: variáveis de borda do grafo se associam a cada borda individual ao longo do caminho correspondente (também chamado de "grau singleton de referência")
  • Fora de um padrão de comprimento variável: as variáveis de borda do grafo se associam à sequência de todas as bordas ao longo do caminho correspondente (também chamado de "grau de referência do grupo")

Exemplo demonstrando ambos os contextos:

MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100

A avaliação da variável e de borda ocorre em dois contextos:

  • MATCH Na declaração: A consulta encontra cadeias de amigos-de-amigos-de-amigos onde cada amizade foi estabelecida desde o ano 2000. Durante a correspondência de padrões, o predicado e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") de padrão de borda é avaliado uma vez para cada borda candidata. Nesse contexto, e está associado a um único valor de referência de borda.

  • Na instruçãoRETURN: aqui, e está associada a uma lista (grupo) de valores de referência de borda na ordem em que eles ocorrem na cadeia correspondente. O resultado é o primeiro valor de referência de e[0] borda em cada cadeia correspondente.

Variáveis de padrão de comprimento variável nas arestas em agregação horizontal:

Variáveis de aresta limitadas por correspondência de padrões de comprimento variável são listas de grupos fora do padrão de comprimento variável e, portanto, podem ser usadas em agregação horizontal.

MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100

Veja a seção sobre agregação horizontal para mais detalhes.