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.
Os padrões de grafos são os blocos fundamentais das suas consultas GQL no Graph no Microsoft Fabric. 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.
Este artigo explica a sintaxe e as regras de composição para padrões de grafos no GQL.
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:
(:Place&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" . Esta combinação de rótulos e propriedades necessárias é chamada de preenchimento do padrão de nó.
Conceitos-chave:
-
Correspondência de rótulos: use
¶ 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
Os nós podem ter múltiplas etiquetas, mas tipos de arestas com múltiplas etiquetas ainda não são suportados.
Padrões de aresta simples
Os padrões de borda são mais complexos do que os padrões de nó. Eles não só especificam um filler como também ligam 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 — determina (:Person) tanto o padrão do nó de origem como (:Comment) o padrão do nó alvo. 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)
Este padrão corresponde às mesmas arestas que (:Song)-[:inspired]->(:Movie) e (:Movie)-[:inspired]->(:Song) combinados, independentemente de qual é o nó de origem e qual é o alvo (este exemplo não é do tipo grafo 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.
Exemplo:
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.birthday < 19900101 AND p.gender = 'female')
-[:workAt]->
(c:Company WHERE c.name STARTS WITH 'A')
-- Filter on an edge property
MATCH (p1:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.browserUsed = 'Firefox' AND c.name IS NOT NULL
-- Filter during matching and after
MATCH (p:Person WHERE p.gender = 'male')-[:workAt]->(c:Company)
WHERE p.birthday < 19900101 AND c.url IS NOT NULL
Sugestão
Mantenha um predicado dentro do padrão quando este descreve qual nó ou aresta pode participar na correspondência.
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.
Padrões no mesmo MATCH não têm de partilhar uma variável. Padrões desconexos formam um produto cartesiano das suas correspondências. Reutilizar uma variável quando os padrões devem ligar o mesmo elemento do grafo e só as combinações unidas devem permanecer.
Reutilização dos elementos de controlo
O GQL controla nós e arestas repetidos em dois níveis:
- Um modo de correspondência aplica-se ao padrão completo do grafo, incluindo caminhos separados por vírgulas.
- Um modo de caminho aplica-se a um caminho.
O modo de jogo padrão é REPEATABLE ELEMENTS. Permite que a mesma ligação de elementos ocorra em diferentes partes do padrão do grafo, sujeita ao modo de caminho de cada caminho. Pode escrevê-lo explicitamente:
REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
Use DIFFERENT EDGES ou o seu sinónimo DIFFERENT RELATIONSHIPS para exigir unicidade de arestas em todo o padrão do grafo. Este modo de jogo também altera qualquer WALK caminho no padrão para TRAIL comportamento.
DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
Os seguintes modos de caminho controlam elementos repetidos dentro de cada caminho:
| Modo de trajecto | Reutilização de elementos |
|---|---|
WALK |
Nós e arestas podem repetir-se. |
TRAIL |
As arestas não podem repetir-se, mas os nós podem repetir-se. |
SIMPLE |
Os nós não podem repetir-se, exceto que o primeiro e o último nó podem ser iguais. As arestas não se repetem. |
ACYCLIC |
Os nós não podem repetir-se, incluindo o primeiro e o último nó. As arestas não se repetem. |
WALK é o modo de caminho predefinido. Prefixe um caminho com outro modo quando precisar de uma unicidade de elemento mais estrita:
Para SIMPLE e ACYCLIC, a unicidade das arestas decorre da unicidade do nó. Um caminho pode fechar-se SIMPLE ao regressar ao seu primeiro nó, mas ainda assim não pode reutilizar uma aresta.
TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)
O TRAIL padrão produz apenas correspondências em que e1, e2, e e3 são diferentes. Os nós ainda podem repetir-se, pelo que o caminho pode formar um ciclo sem reutilizar uma aresta.
Controlar quais caminhos são devolvidos
Um prefixo de pesquisa de caminho controla quais caminhos um padrão de caminho retorna. O prefixo padrão ALL devolve todos os caminhos que correspondem ao modo e padrão do caminho. Pode escrever ALL explicitamente:
ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)
Utilize-se ANY SHORTEST para devolver um caminho correspondente mais curto para cada par origem-destino de cada linha de entrada:
MATCH p = ANY SHORTEST
(src:Person)-[:knows]->{1,4}(dst:Person)
RETURN src.id AS sourceId, dst.id AS targetId, path_length(p) AS hopCount
ORDER BY sourceId, targetId
LIMIT 100
Se múltiplos caminhos empatam para o comprimento mais curto, a consulta devolve um deles, mas qual caminho ligado é devolvido não é determinístico. Um limite inferior zero pode devolver um caminho de zero salto de um nó de origem para si próprio.
ALL SHORTEST E ANY as buscas de caminho não são suportadas.
Coloque predicados antes ou depois da seleção de caminhos
A colocação de predicados determina se uma condição define caminhos elegíveis ou se filtra caminhos depois de o prefixo de pesquisa de caminho os ter selecionado:
- Um inline
WHEREnum padrão de nó ou aresta faz parte do padrão. Restringe quais caminhos são elegíveis antesALLouANY SHORTESTaplicados. - Um nível
WHEREde instrução após o padrão completoMATCHé um filtro de postfiltro. Filtra as linhas depois de o prefixo de pesquisa de caminho ter selecionado caminhos. - Uma instrução subsequente
FILTERtambém filtra linhas após a seleção do caminho.
Esta distinção é especialmente importante com ANY SHORTEST. No padrão seguinte, apenas knows as arestas criadas na data especificada ou após a data especificada são elegíveis quando a consulta seleciona o caminho mais curto:
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')
-[connection:knows
WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z')]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
RETURN p
Mover a condição da aresta para um filtro de postfiltro altera o significado. A consulta seleciona primeiro o caminho mais curto sem essa condição. Depois, remove o caminho selecionado se alguma aresta falhar a condição; não seleciona um caminho mais longo em vez disso:
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')
-[connections:knows]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
FILTER ALL(connection IN connections
WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z'))
RETURN p
Importante
Para algumas ANY SHORTEST formas de consulta, o Graph pode atualmente aplicar uma condição ao nível MATCH ... WHERE da instrução antes da seleção do caminho. Até que esta limitação seja resolvida, utilize predicados inline para elegibilidade de caminho e uma instrução separada FILTER para filtragem pós-seleção. Para obter mais informações, consulte Limitações atuais.
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
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 zero. Uma correspondência zero-hop não contém arestas e requer que ambos os padrões de nós finais correspondam ao mesmo nó.
Example:
(p1:Person)-[:knows]->{0,1}(p2:Person)
Este padrão corresponde a cada pessoa tanto p1 como a p2 zero saltos, e corresponde a pares ligados num único salto.
Quando não é especificado nenhum limite inferior em {,n}, por defeito, é 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 onde pessoas que se conhecem gostaram de comentários diferentes e uma mensagem m está ligada a cada comentário por uma cadeia de uma a três replyOf arestas.
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:
MATCHNa 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 predicadoe.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")do padrão de aresta é avaliado uma vez para cada aresta candidata. Neste contexto,eestá vinculado a um único valor de referência de aresta.RETURNNa instrução: Aqui,eestá 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 dee[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
Para mais informações, consulte Funções agregadas.
Padrões de comprimento variável ilimitados
Use um quantificador ilimitado quando o comprimento máximo do caminho não for conhecido:
-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)
Os * atalhos e + especificam zero ou mais repetições e uma ou mais repetições:
-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)
-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)
Um padrão ilimitado com a combinação padrão ALL WALK é rejeitado porque os ciclos podem produzir infinitos caminhos correspondentes. Use TRAIL, SIMPLE, ou ACYCLIC limitar o caminho através da unicidade de aresta ou nó. Estes modos garantem a terminação, mas um grafo grande ainda pode produzir um grande número de caminhos.
Importante
Para um caminho limitado por um ilimitado ANY SHORTEST WALK, os únicos usos suportados são PATH_LENGTH(path) e, juntamente com ele, path IS NULL. O gráfico não materializa o percurso completo nesta forma. Use um limite superior finito ou especifique TRAIL, SIMPLE, ou ACYCLIC para retornar ou usar de outra forma o caminho.