Exemplo de esquema GQL: rede social

Este artigo fornece a especificação técnica completa para o tipo de grafo de rede social usado em toda a documentação da GQL. Esse esquema demonstra muitos recursos comuns de grafos complexos e serve como base para todos os exemplos de consulta na documentação da linguagem GQL.

Observação

O exemplo de rede social é derivado do LDBC SNB (LDBC Social Network Benchmark) publicado pelo GDC (Graph Data Council).

Para obter mais informações, consulte o artigo "O LDBC Social Network Benchmark". Para obter informações sobre como obter uma cópia do conjunto de dados derivado, consulte o conjunto de dados de grafo de exemplo de rede social.

Diagrama mostrando o esquema da rede social.

Especificação de domínio

O domínio da rede social modela uma plataforma social abrangente com as seguintes entidades:

  • Pessoas com propriedades demográficas e comportamentais
  • Organizações incluindo instituições educacionais (universidades) e empregadores (empresas)
  • Hierarquia geográfica de cidades por países/regiões para continentes
  • Sistema de conteúdo com fóruns, postagens e comentários encadeados
  • Sistema de taxonomia com marcas e classificações de marca
  • Relações sociais e profissionais entre pessoas e organizações

Para obter uma introdução mais detalhada às entidades desse domínio, consulte o guia de linguagem GQL.

Recursos de esquema demonstrados

Este tipo de grafo mostra os recursos avançados da GQL:

  • Herança de tipo de nó usando tipos base abstratos (Message, Organization, Place)
  • Vários padrões de herança com definições de propriedade compartilhada
  • Famílias de tipo de borda em que o mesmo rótulo de relação conecta diferentes combinações de tipo de nó
  • Sistema de restrição abrangente garantindo a integridade dos dados por meio de restrições de chave
  • Padrões de relação mistos , incluindo contenção hierárquica, conexões sociais e interações de conteúdo

Definição de esquema completa

O tipo de grafo a seguir fornece uma definição de esquema completa na sintaxe GQL:

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

CONSTRAINT tag_class_pk
FOR (n:TagClass) REQUIRE (n.id) IS KEY,

(:TagClass)-[:isSubclassOf]->(:TagClass),

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

(:Tag)-[:hasType]->(:TagClass),

CONSTRAINT tag_pk
FOR (n:Tag) REQUIRE (n.id) IS KEY,

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

(:City => :Place),
(:Country => :Place),
(:Continent => :Place),

CONSTRAINT place_pk
FOR (n:Place) REQUIRE (n.id) IS KEY,

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

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

(:University => :Organization),
(:Company => :Organization),

CONSTRAINT organization_pk
FOR (n:Organization) REQUIRE (n.id) IS KEY,

(:University)-[:isLocatedIn]->(:City),
(:Company)-[:isLocatedIn]->(:Country),

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

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

(:Person)-[:hasInterest]->(:Tag),
(:Person)-[:isLocatedIn]->(:City),
(:Person)-[:studyAt { classYear :: UINT64 }]->(:University),
(:Person)-[:workAt { workFrom :: UINT64 }]->(:Company),
(:Person)-[:knows { creationDate :: ZONED DATETIME }]->(:Person),

(:Forum => {
    id :: UINT64 NOT NULL,
    creationDate :: ZONED DATETIME,
    title :: STRING
}),

CONSTRAINT forum_pk
FOR (n:Forum) REQUIRE (n.id) IS KEY,

(:Forum)-[:hasTag]->(:Tag),
(:Forum)-[:hasMember { creationDate :: ZONED DATETIME, joinDate :: UINT64 }]->(:Person),
(:Forum)-[:hasModerator]->(:Person),

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

CONSTRAINT message_pk
FOR (n:Message) REQUIRE (n.id) IS KEY,

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

(:Person)-[:likes { creationDate :: ZONED DATETIME }]->(:Post),
(:Post)-[:hasCreator]->(:Person),
(:Post)-[:isLocatedIn]->(:Country),
(:Forum)-[:containerOf]->(:Post),

(:Comment => :Message),

(:Person)-[:likes { creationDate :: ZONED DATETIME }]->(:Comment),
(:Comment)-[:hasCreator]->(:Person),
(:Comment)-[:isLocatedIn]->(:Country),

(:Comment)-[:replyOf]->(<:Message),
(:Person)-[:likes { creationDate :: ZONED DATETIME }]->(<:Message),
(<:Message)-[:hasCreator]->(:Person),
(<:Message)-[:isLocatedIn]->(:Country),
(<:Message)-[:hasTag]->(:Tag)

Análise de esquema

Hierarquia de tipos de nó

O esquema define três hierarquias de herança:

Hierarquia geográfica:

  • Place(abstrato) →City, , CountryContinent

Hierarquia organizacional:

  • Organization (abstrato) → University, Company

Hierarquia de conteúdo:

  • Message (abstrato) → Post, Comment

Famílias de tipos de borda

Várias famílias de tipos de formulário de rótulos de borda que conectam diferentes combinações de nós:

Relações de localização (isPartOf):

  • As cidades pertencem a países/regiões: (:City)-[:isPartOf]->(:Country)
  • Países/regiões pertencem a continentes: (:Country)-[:isPartOf]->(:Continent)

Interações de conteúdo (likes):

  • As pessoas gostam de postagens: (:Person)-[:likes]->(:Post)
  • As pessoas gostam de comentários: (:Person)-[:likes]->(:Comment)
  • As pessoas gostam de mensagens: (:Person)-[:likes]->(<:Message)

Localização geográfica (isLocatedIn):

  • As pessoas vivem em cidades: (:Person)-[:isLocatedIn]->(:City)
  • Universidades localizadas em cidades: (:University)-[:isLocatedIn]->(:City)
  • Empresas localizadas em países/regiões: (:Company)-[:isLocatedIn]->(:Country)
  • Postos localizados em países/regiões: (:Post)-[:isLocatedIn]->(:Country)
  • Comentários localizados em países/regiões: (:Comment)-[:isLocatedIn]->(:Country)

Restrições de chave

Cada tipo de nó tem uma restrição de chave correspondente, garantindo a identificação exclusiva por id propriedade:

  • tag_class_pk, tag_pk, place_pk, organization_pk, , person_pk, forum_pk, message_pk