Partilhar via


Padrões de gráficos GQL

Observação

Esta funcionalidade está atualmente em pré-visualização pública. Essa visualização é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

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

Importante

Este artigo utiliza exclusivamente o conjunto de dados gráfico de exemplo de redes sociais.

Padrões de elementos simples

Padrões de elementos simples ajudam você a combinar nós e bordas individuais do seu gráfico que atendem a requisitos específicos. Esses padrões formam a base para uma 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 para corresponder:

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

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

Conceitos-chave:

  • Correspondência de rótulos: use & para exigir vários rótulos.
  • Filtragem de propriedades: especifique 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últiplas etiquetas de elementos ainda não são suportados (problema conhecido).

Padrões de aresta simples

Os padrões de borda são mais complexos do que os padrões de nó. Eles não apenas 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 do nó de destino. Entender a direção da borda é crucial para consultar seu gráfico corretamente.

Padrão espelhado equivalente:

Você pode virar 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)

Este padrão encontra as mesmas relações, mas a partir da perspetiva oposta.

Padrões de borda direcionados a qualquer

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

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

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

Atalhos de padrão de borda do gráfico

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 no sentido inverso 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 específico do grá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 arestas que conectam isLocatedIn nós ou Personnós -mas-não-Organization (que são sempre Company nós no esquema de University rede social) para City ou Country nós.

Sintaxe:

Sintaxe Meaning
A&B Os rótulos devem 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 do rótulo. Por padrão, ! tem a maior precedência e & tem maior precedência do que |. Portanto, !A&B|C|!D é o mesmo que ((!A)&B)|C|(!D).

Variáveis de ligação

As variáveis permitem que você faça referência a elementos gráficos correspondentes em outras partes da consulta. Entender como vincular e usar variáveis é essencial para criar consultas poderosas.

Variáveis de elemento de ligação

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

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

Neste padrão, p está ligado a nós correspondentes Person , w a bordas correspondentes workAt e c a nós correspondentes Company .

Reutilização variável por condicionalismos estruturais:

Reutilizar a mesma variável em um padrão várias vezes expressa uma restrição na estrutura das correspondências. Cada ocorrência da mesma variável deve sempre ligar-se ao mesmo elemento gráfico em uma correspondência válida. A reutilização variável é poderosa para expressar requisitos estruturais complexos.

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

O padrão encontra Person nós x e y que se conhecem e trabalham ao mesmo tempo Company, que está ligado à variável c. A reutilização de c garante que ambas as pessoas trabalhem na mesma empresa.

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

As variáveis de elemento de vinculação permitem especificar predicados de padrão de nó e borda. Em vez de apenas fornecer um preenchimento com valores de propriedade exatos como { name: "New York, USA" }, um preenchedor 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 ligam à borda individual no predicado de padrão de borda, mesmo quando se usam padrões de comprimento variável. Isso pode ajudar a não ter que desaninhar variáveis de lista de grupos de borda para executar um pós-filtro. Consulte Vincular variáveis de borda de padrão de comprimento variável.

Técnicas avançadas de predicados de padrões:

Os predicados de padrão fornecem poderosos recursos de filtragem em linha 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

Sugestão

O uso de 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 ligação

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

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

Aqui, p está vinculado 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 dada.

Os caminhos limitados podem ser devolvidos ao utilizador 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

As consultas do mundo real geralmente exigem padrões mais complexos do que estruturas simples de nó de borda de nó. O GQL fornece várias maneiras de compor padrões para sofisticados traversais de grafos.

Compor padrões de caminho

Os padrões de caminho podem ser compostos pela concatenação de padrões simples de nó e borda para criar travessias mais longas.

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

O padrão atravessa 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 por partes: Você também pode criar padrões de caminho de forma mais incremental, o que pode tornar padrões complexos mais fáceis de ler e entender:

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

Essa abordagem divide a mesma travessia 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 combinar estruturas mais complexas, como padrões "em forma de estrela" que irradiam de um nó central:

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

O padrão encontra 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 jogos

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

O prefixo de um padrão de caminho com a palavra-chave TRAIL descarta todas as correspondências que ligam a mesma borda várias vezes:

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

Ao usar TRAILo , o padrão produz apenas correspondências nas quais todas as arestas são diferentes. Portanto, mesmo c = a que tal que o caminho forme um ciclo em uma determinada correspondência, e3 nunca se liga à mesma borda que e1.

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

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ões repetitivos. Eles são essenciais para atravessar hierarquias, redes sociais e outras estruturas onde o comprimento ideal do caminho não é conhecido com antecedência.

Padrões de comprimento variável delimitado

Importante

Atualmente, os padrões de comprimento variável delimitado suportam apenas um limite superior máximo de 8. Veja o artigo sobre as limitações atuais.

Muitas consultas gráficas comuns exigem a repetição do 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)

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

Intervalos de repetição flexíveis: Para maior 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 em uma única consulta.

Observação

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

Exemplo:

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

Este padrão corresponde a pares de pessoas diferentes que se conhecem, mas também corresponde à mesma pessoa como 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 seguinte consulta:

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 através de cadeias de resposta de 1 a 5 níveis cada.

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

Quando você vincula 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. Compreender 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: as variáveis de borda do gráfico se ligam a cada aresta individual ao longo do caminho correspondente (também chamado de "grau de referência singleton")
  • Fora de um padrão de comprimento variável: as variáveis de borda do gráfico se ligam à sequência de todas as arestas ao longo do caminho correspondente (também chamado de "grau de referência do grupo")

Exemplo que demonstra 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 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") do padrão de aresta é avaliado uma vez para cada aresta candidata. Neste contexto, e está vinculado a um único valor de referência de aresta.

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

Variáveis de arestas de padrão de comprimento variável 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, por isso, 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

Consulte a secção sobre agregação horizontal para mais detalhes.