Compartilhar via


Tipos 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.

Um tipo de grafo descreve a estrutura do grafo definindo quais nós e bordas podem existir. Pense nele como um blueprint ou esquema , ele especifica a forma de nós e bordas no grafo em termos de seus rótulos e propriedades. Para bordas (as conexões entre nós), ele também especifica quais tipos de bordas podem se conectar a quais tipos de nós. Se você estiver familiarizado com bancos de dados relacionais, os tipos de grafo funcionarão de forma semelhante à forma como os diagramas de ER descrevem tabelas e relações de chave estrangeira.

Importante

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

Os tipos de grafo fornecem vários benefícios principais:

  • Validação de dados: verifique se o grafo contém apenas combinações válidas de nó e borda.
  • Otimização de consulta: ajude o mecanismo de consulta a entender sua estrutura de dados para melhorar o desempenho.
  • Documentação: serve como uma especificação clara da estrutura do grafo para desenvolvedores e analistas.

Observação

Este artigo apresenta os tipos de grafo conceitualmente e ilustra sua definição usando a sintaxe definida no padrão GQL. No entanto, atualmente, essa sintaxe não tem suporte direto para o graph no Microsoft Fabric.

Estruturalmente, um tipo de grafo define tipos de nó permitidos e tipos de borda de grafos do tipo grafo, bem como restrições adicionais que restringem ainda mais esses grafos.

Observação

Os tipos de grafo são definidos fornecendo um conjunto de definições de tipo de nó, tipo de borda e restrição. Alterar a ordem dessas definições não altera o tipo de grafo que está sendo definido.

Definir tipos de nó

Um tipo de nó especifica quais rótulos e tipos de propriedade seus nós podem ter. Veja como especificar um tipo de nó básico:

(:Organization => { 
  id :: UINT64 NOT NULL, 
  name :: STRING, 
  url :: STRING 
})

Este exemplo cria um tipo de nó que define nós com:

  • O rótulo Organization.
  • Uma id propriedade que contém valores inteiros sem sinal e não pode ser nula.
  • Uma name propriedade que contém valores de cadeia de caracteres (pode ser nula).
  • Uma url propriedade que contém valores de cadeia de caracteres (pode ser nula).

O :: operador especifica o tipo de dados para cada propriedade, enquanto NOT NULL indica que a propriedade deve sempre ter um valor.

Observação

NOT NULL é considerado parte do tipo em GQL, que difere do SQL.

Os tipos de nó também podem ser mais complexos, com mais propriedades e tipos de dados:

(:Person => {
    id :: UINT64 NOT NULL,
    creationDate :: ZONED DATETIME,
    firstName :: STRING,
    lastName :: STRING,
    gender :: STRING,
    birthday :: UINT64,
    browserUsed :: STRING,
    locationIP :: STRING
})

Tipos de nó com vários rótulos

Os nós podem ter vários rótulos para dar suporte à herança e à categorização. Você pode especificar vários rótulos para um tipo de nó, mas um rótulo (o "rótulo de chave") deve identificar exclusivamente o tipo de nó (se apenas um rótulo for especificado, isso será usado para ser o rótulo de chave do tipo de nó).

Como exemplo, considere:

(:University => :Organization),

(:Company => :Organization)

Aqui, University e Company são definidos os principais rótulos dos dois tipos de nó, enquanto Organization é um rótulo secundário compartilhado por ambos os tipos. Observe como o rótulo de chave e os rótulos secundários são separados por => cada tipo de nó. Essa abordagem cria uma hierarquia de tipos em que universidades e empresas são tipos de organizações.

Como os rótulos de chave identificam tipos de nó, as propriedades dos tipos de nó identificados por rótulos secundários são herdadas automaticamente ao usar essa sintaxe. Portanto, a sintaxe anterior pode ser compreendida para definir efetivamente os seguintes tipos de nó:

(:University => :Organization {
  id :: UINT64 NOT NULL, 
  name :: STRING, 
  url :: STRING 
}),

(:Company => :Organization {
  id :: UINT64 NOT NULL, 
  name :: STRING, 
  url :: STRING 
})

Observação

Os rótulos de chave são essenciais quando você está definindo hierarquias de tipo de nó. Eles ajudam o sistema a entender a qual tipo de nó você está se referindo quando vários tipos compartilham os mesmos rótulos.

Economizar tempo com atalhos de herança

Repetir rótulos e propriedades de tipos de nó pai fica entediante e propenso a erros. O Graph no Microsoft Fabric fornece o += operador para que você possa especificar apenas os tipos de propriedade e rótulos extras (não especificados):

(:Post => :Message += {
    language :: STRING,
    imageFile :: STRING
})

Quando nenhuma propriedade extra é especificada, o grafo herda todas as propriedades necessárias do tipo pai:

(:Comment => :Message)  -- Same as: (:Comment => :Message += {})

Usar tipos de nó abstrato

Você pode definir tipos de nó puramente para criar hierarquias, mesmo quando o grafo não contém nós concretos desse tipo. Tipos de nó abstrato são úteis para criar agrupamentos conceituais e conjuntos de propriedades compartilhadas. Para essa finalidade, você pode definir um tipo de nó como ABSTRACT no grafo no Microsoft Fabric:

ABSTRACT (:Message => {
    id :: UINT64 NOT NULL,
    creationDate :: ZONED DATETIME,
    browserUsed :: STRING,
    locationIP :: STRING,
    content :: STRING,
    length :: UINT64
})

Tipos de nó abstrato não estão disponíveis para carregamento direto de grafo, eles existem apenas para estruturar sua hierarquia e definir propriedades compartilhadas. Tipos concretos de nó que herdam de tipos abstratos podem ser carregados com dados.

Definir tipos de borda e famílias

Um tipo de borda define o rótulo de chave, os tipos de propriedade e os tipos de nó de ponto de extremidade para bordas. Em bancos de dados de grafo, as bordas representam conexões entre nós. A definição de borda informa ao sistema quais relações são permitidas no grafo:

(:Person)-[:knows { creationDate :: ZONED DATETIME }]->(:Person)

Esse tipo de borda define todas as bordas com:

  • O rótulo knows(chave).
  • Uma creationDate propriedade que contém ZONED DATETIME valores (carimbos de data/hora junto com um deslocamento de fuso horário).
  • Pontos de extremidade de origem e de destino que devem ser Person nós.

A seta -> indica a direção da borda, da origem ao destino. Essas informações direcionais são cruciais para entender a semântica do grafo.

Aqui estão mais exemplos de tipos de borda:

(:Person)-[:studyAt { classYear :: UINT64 }]->(:University)
(:Person)-[:workAt { workFrom :: UINT64 }]->(:Company)

Você só precisa especificar os rótulos de chave (Personou UniversityCompany) para tipos de nó de ponto de extremidade. Você não precisa repetir a definição completa do tipo de nó. O sistema resolve essas referências para as definições completas de tipo de nó.

Famílias de tipos de borda do grafo

Os rótulos de chave de borda do grafo funcionam de forma diferente dos rótulos de chave de nó. Você pode ter vários tipos de borda com o mesmo rótulo de chave em um tipo de grafo, desde que eles tenham os mesmos rótulos e tipos de propriedade. No entanto, dois tipos de borda com o mesmo rótulo de chave devem ser diferentes em pelo menos um tipo de nó de ponto de extremidade. Chamamos um conjunto de tipos de borda com o mesmo rótulo de chave de uma família de tipos de borda.

Esse conceito permite que você modele o mesmo tipo de relação entre diferentes tipos de entidades.

Example:

(:City)-[:isPartOf]->(:Country),
(:Country)-[:isPartOf]->(:Continent)

Ambos os tipos de borda usam o isPartOf rótulo, mas conectam diferentes tipos de nós, formando uma família de tipos de borda que representa relações de contenção hierárquicas.

Usar subtipagem de nós em definições de tipos de aresta

Ter que detalhar cada tipo possível de aresta pode ser um pouco tedioso. Para simplificar, também é possível definir famílias de tipos de arestas que se alinham com a hierarquia de tipos de nós implícita por seus pontos finais.

Exemplo:

-- Node types
ABSTRACT (:Message { ... }),
(:Post => :Message { ... }),
(:Comment => :Message { ... }),

-- All edge types (x)-[:hasTag]->(:Tag) where x is at least a (:Message)
(<:Message)-[:hasTag]->(:Tag) 

Isso define implicitamente os seguintes tipos de aresta:

(:Post)-[:hasTag]->(:Tag) 
(:Comment)-[:hasTag]->(:Tag) 

Tipos de propriedade com suporte

Quando você está definindo um tipo de propriedade, o tipo de valor da propriedade deve ser aquele compatível com o grafo no Microsoft Fabric. Escolher os tipos de dados corretos é importante para eficiência de armazenamento e desempenho de consulta.

Aqui estão os tipos de dados que você pode usar para valores de propriedade:

  • INT (também: INT64)
  • UINT (também: UINT64)
  • STRING
  • BOOL (também: BOOLEAN)
  • DOUBLE (também: FLOAT64, FLOAT)
  • T NOT NULL, onde T está qualquer um dos tipos de dados anteriores.
  • LIST<T> e LIST<T> NOT NULL, onde T está qualquer um dos tipos de dados anteriores.

Para obter informações completas sobre tipos de valor, consulte valores GQL e tipos de valor.

Importante

Todos os tipos de propriedade com o mesmo nome que ocorrem em um tipo de nó ou tipo de borda de um determinado tipo de grafo devem especificar o mesmo tipo de valor de propriedade. A única exceção: eles podem diferir se incluem o valor nulo. Por exemplo, de acordo com essa regra, um tipo de grafo com (:A { id :: STRING }), (:B { id :: STRING NOT NULL}) seria válido, enquanto um tipo de grafo com (:A { id :: STRING }), (:B { id :: INT}) seria inválido.

Configurar restrições de chave de nó

Restrições de chave de nó definem como cada nó em seu grafo é identificado exclusivamente por um ou mais de seus valores de propriedade. As restrições de chave funcionam como restrições de chave primária em bancos de dados relacionais e garantem a integridade dos dados. Uma restrição de chave de nó pode direcionar nós em vários tipos de nó, o que permite definir chaves de nó para hierarquias conceituais inteiras.

Entender as principais restrições é crucial porque elas:

  • Garanta a exclusividade: evite nós duplicados com base na lógica de negócios.
  • Habilitar pesquisas eficientes: permita que o sistema otimize as consultas que pesquisam nós específicos.
  • Suporte à integração de dados: forneça uma maneira estável de referenciar nós em diferentes fontes de dados.

Importante

Para o grafo no Microsoft Fabric, exatamente uma restrição de chave deve restringir cada nó.

Como funcionam as restrições de chave de nó

Você pode especificar restrições de chave de nó em seu tipo de grafo. Cada restrição de chave de nó tem características específicas que o fazem funcionar efetivamente:

Componentes de uma restrição de chave de nó:

  • Tem um nome exclusivo dentro do tipo de grafo para uma referência fácil.
  • Define nós direcionados usando um padrão de restrição simples que especifica a quais nós a restrição se aplica.
  • Define as propriedades que formam o valor de chave exclusivo.

Example:

CONSTRAINT person_pk
  FOR (n:Person) REQUIRE n.id IS KEY

Essa sintaxe cria uma restrição de chave de nó chamada person_pk para todos os nós com pelo menos o Person rótulo. A restrição garante que cada nó no grafo seja identificado exclusivamente por sua id propriedade. Nenhum dos dois nós com o Person rótulo pode ter o mesmo id valor.

Você também pode definir chaves compostas que usam várias propriedades juntas para garantir a exclusividade usando a CONSTRAINT ... FOR ... REQUIRE (n.prop1, n.prop2) IS KEY sintaxe.

Importante

Propriedades usadas em restrições de chave:

  • Não pode ser nulo
  • Deve ser declarado como NOT NULL nos tipos de nó e tipos de borda direcionados pela restrição de chave