GQL-séma példa: Közösségi hálózat

Ez a cikk a GQL dokumentációjában használt közösségi hálózati gráftípus teljes műszaki specifikációját tartalmazza. Ez a séma az összetett gráfok számos gyakori funkcióját mutatja be, és a GQL nyelvi dokumentációjában szereplő összes lekérdezési példa alapjául szolgál.

Megjegyzés:

A közösségi hálózati példa a GDC (Graph Data Council) által közzétett LDBC SNB -ből (LDBC Social Network Benchmark) származik.

További információ: "The LDBC Social Network Benchmark". A származtatott adathalmaz másolatának beszerzéséről további információt a közösségi hálózat példagráfadatkészletében talál.

A közösségi hálózati sémát bemutató ábra.

Tartomány specifikációja

A közösségi hálózat tartománya egy átfogó közösségi platformot modellez az alábbi entitásokkal:

  • Demográfiai és viselkedési tulajdonságokkal rendelkező személyek
  • Oktatási intézményeket (egyetemeket ) és munkáltatókat (vállalatokat) is beleértve
  • Földrajzi hierarchia városoktól országokon/régiókon át kontinensekig
  • Tartalomrendszer fórumokkal, bejegyzésekkel és szálas megjegyzésekkel
  • Osztályozási rendszer címkékkel és címkebesorolásokkal
  • Emberek és szervezetek közötti társadalmi és szakmai kapcsolatok

A tartomány entitásainak részletesebb ismertetését a GQL nyelvi útmutatójában találja.

A bemutatott sémafunkciók

Ez a gráftípus speciális GQL-képességeket mutat be:

  • Csomóponttípus-öröklés absztrakt alaptípusokkal (Message, Organization, Place)
  • Több öröklési minta megosztott tulajdonságdefiníciókkal
  • Peremhálózati típuscsaládok , ahol ugyanaz a kapcsolatcímke különböző csomóponttípus-kombinációkat kapcsol össze
  • Az adatintegritást kulcskorlátozásokkal biztosító átfogó kényszerrendszer
  • Vegyes kapcsolati minták, beleértve a hierarchikus elszigetelést, a közösségi kapcsolatokat és a tartalom interakcióit

Sémadefiníció befejezése

A következő gráftípus teljes sémadefiníciót biztosít a GQL szintaxisában:

(: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)

Sémaelemzés

Csomóponttípus-hierarchia

A séma három öröklési hierarchiát határoz meg:

Földrajzi hierarchia:

  • Place(absztrakt) → City, CountryContinent

Szervezeti hierarchia:

  • Organization (absztrakt) → University, Company

Tartalomhierarchia:

  • Message (absztrakt) → Post, Comment

Peremhálózat-típuscsaládok

Több élfelirat típuscsaládja különböző csomópontkombinációkat köt össze:

Helykapcsolatok (isPartOf):

  • A városok országokhoz/régiókhoz tartoznak: (:City)-[:isPartOf]->(:Country)
  • Az országok/régiók kontinensekhez tartoznak: (:Country)-[:isPartOf]->(:Continent)

Tartalom-interakciók (likes):

  • A bejegyzéseket kedvelő személyek: (:Person)-[:likes]->(:Post)
  • A felhasználók szeretik a megjegyzéseket: (:Person)-[:likes]->(:Comment)
  • A felhasználók szeretik az üzeneteket: (:Person)-[:likes]->(<:Message)

Földrajzi hely (isLocatedIn):

  • Az emberek városokban élnek: (:Person)-[:isLocatedIn]->(:City)
  • Városokban található egyetemek: (:University)-[:isLocatedIn]->(:City)
  • Országokban/régiókban található vállalatok: (:Company)-[:isLocatedIn]->(:Country)
  • Országokban/régiókban található posztok: (:Post)-[:isLocatedIn]->(:Country)
  • Hozzászólások országokban/régiókban: (:Comment)-[:isLocatedIn]->(:Country)

Fő megkötések

Minden csomóponttípus rendelkezik egy megfelelő kulcskényszerrel, amely tulajdonságonként egyedi azonosítást id biztosít:

  • tag_class_pk, tag_pk, place_pk, organization_pkperson_pk, forum_pkmessage_pk