Príklad schémy GQL: Sociálna sieť

Tento článok poskytuje úplnú technickú špecifikáciu pre typ grafu sociálnej siete, ktorý sa používa v celej dokumentácii GQL. Táto schéma zobrazuje množstvo bežných funkcií zložitých grafov a slúži ako základ pre všetky príklady dotazov v dokumentácii jazyka GQL.

Poznámka

Príklad sociálnej siete je odvodený od knižnice LDBC SNB (LDBC Social Network Benchmark), ktorú zverejnila GDC (Graph Data Council).

Ďalšie informácie nájdete v článku "LDBC Social Network Benchmark". Informácie o tom, ako získať kópiu odvodenej množiny údajov, nájdete v téme Graf množiny údajov v príklade sociálnej siete.

Diagram znázorňujúci schému sociálnej siete.

Špecifikácia domény

Doménové modely sociálnej siete sú komplexnou sociálnou platformou s nasledujúcimi entitami:

  • Ľudia s demografickými vlastnosťami a vlastnosťami správania
  • Organizácie vrátane vzdelávacích inštitúcií (univerzít) a zamestnávateľov (spoločnosti)
  • Geografická hierarchia od miest cez krajiny alebo oblasti po kontinenty
  • Obsahový systém s fórami, príspevkami a postupnými komentármi
  • Systém taxonómie so značkami a klasifikáciami značiek
  • Sociálne a profesionálne vzťahy medzi ľuďmi a organizáciami

Podrobnejšie úvodné informácie o entitách tejto domény nájdete v téme Príručka jazyka GQL.

Znázornené funkcie schémy

Tento typ grafu prezentuje pokročilé funkcie GQL:

  • Dedenie typu uzla pomocou abstraktných základných typov (Message, Organization, Place)
  • Viaceré vzory dedenia so zdieľanými definíciami vlastností
  • Skupiny typov prehliadača Edge , kde rovnaké označenie vzťahu spája rôzne kombinácie typov uzla
  • Komplexný systém obmedzení, ktorý zabezpečuje integritu údajov prostredníctvom kľúčových obmedzení
  • Vzory zmiešaných vzťahov vrátane hierarchickej izolácie, sociálnych prepojení a interakcií s obsahom

Dokončenie definície schémy

Nasledujúci typ grafu poskytuje úplnú definíciu schémy v syntaxi 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)

Analýza schémy

Hierarchia typov uzla

Schéma definuje tri hierarchie dedenia:

Geografická hierarchia:

  • Place(abstrakt) → City, , CountryContinent

Hierarchia organizácie:

  • Organization (abstrakt) → University, Company

Hierarchia obsahu:

  • Message (abstrakt) → Post, Comment

Skupiny typov prehliadača Edge

Viacero skupín typov formulárov okrajových označení, ktoré sa pripájajú k rôznym kombináciám uzla:

Vzťahy medzi miestami (isPartOf):

  • Mestá patria do krajín alebo oblastí: (:City)-[:isPartOf]->(:Country)
  • Krajiny alebo oblasti patria na kontinenty: (:Country)-[:isPartOf]->(:Continent)

Interakcie s obsahom (likes):

  • Ľudia majú radi príspevky: (:Person)-[:likes]->(:Post)
  • Ľudia majú radi komentáre: (:Person)-[:likes]->(:Comment)
  • Ľuďom sa páčia správy: (:Person)-[:likes]->(<:Message)

Geografická poloha (isLocatedIn):

  • Ľudia žijú v mestách: (:Person)-[:isLocatedIn]->(:City)
  • Univerzity v mestách: (:University)-[:isLocatedIn]->(:City)
  • Spoločnosti nachádzajúci sa v krajinách alebo oblastiach: (:Company)-[:isLocatedIn]->(:Country)
  • Príspevky umiestnené v krajinách/regiónoch: (:Post)-[:isLocatedIn]->(:Country)
  • Komentáre umiestnené v krajinách/regiónoch: (:Comment)-[:isLocatedIn]->(:Country)

Kľúčové obmedzenia

Každý typ uzla má zodpovedajúce obmedzenie kľúča, ktorým sa zabezpečuje jedinečná identifikácia podľa id vlastnosti:

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