Contoh skema GQL: Jejaring sosial

Artikel ini menyediakan spesifikasi teknis lengkap untuk jenis grafik jejaring sosial yang digunakan di seluruh dokumentasi GQL. Skema ini menunjukkan banyak fitur umum grafik kompleks dan berfungsi sebagai fondasi untuk semua contoh kueri dalam dokumentasi bahasa GQL.

Nota

Contoh jejaring sosial berasal dari LDBC SNB (LDBC Social Network Benchmark) yang diterbitkan oleh GDC (Graph Data Council).

Untuk informasi selengkapnya, lihat artikel "Tolok Ukur Jejaring Sosial LDBC". Untuk informasi tentang cara mendapatkan salinan himpunan data turunan, lihat himpunan data grafik contoh jejaring sosial.

Diagram memperlihatkan skema jejaring sosial.

Spesifikasi domain

Domain jejaring sosial memodelkan platform sosial yang komprehensif dengan entitas berikut:

  • Orang dengan sifat demografis dan perilaku
  • Organisasi termasuk lembaga pendidikan (universitas) dan pengusaha (perusahaan)
  • Hierarki geografis dari kota melalui negara/wilayah ke benua
  • Sistem konten dengan forum, posting, dan komentar berulir
  • Sistem taksonomi dengan tag dan klasifikasi tag
  • Hubungan sosial dan profesional antara orang dan organisasi

Untuk pengenalan yang lebih rinci tentang entitas domain ini, lihat panduan bahasa GQL.

Fitur skema yang ditunjukkan

Jenis grafik ini menampilkan kemampuan GQL tingkat lanjut:

  • Pewarisan jenis node menggunakan jenis dasar abstrak (Message, Organization, Place)
  • Beberapa pola pewarisan dengan definisi properti bersama
  • Keluarga jenis edge tempat label hubungan yang sama menyambungkan kombinasi jenis node yang berbeda
  • Sistem batasan komprehensif yang memastikan integritas data melalui batasan utama
  • Pola hubungan campuran termasuk penahanan hierarkis, koneksi sosial, dan interaksi konten

Definisi skema lengkap

Jenis grafik berikut menyediakan definisi skema lengkap dalam sintaks 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)

Analisis skema

Hierarki jenis node

Skema mendefinisikan tiga hierarki pewarisan:

Hierarki geografis:

  • Place(abstrak) → City, , CountryContinent

Hierarki organisasi:

  • Organization (abstrak) → University, Company

Hierarki konten:

  • Message (abstrak) → Post, Comment

Keluarga jenis edge

Beberapa label tepi membentuk jenis keluarga yang menghubungkan kombinasi node yang berbeda:

Hubungan lokasi (isPartOf):

  • Kota milik negara/wilayah: (:City)-[:isPartOf]->(:Country)
  • Negara/wilayah milik benua: (:Country)-[:isPartOf]->(:Continent)

Interaksi konten (likes):

  • Orang-orang menyukai postingan: (:Person)-[:likes]->(:Post)
  • Orang-orang menyukai komentar: (:Person)-[:likes]->(:Comment)
  • Orang-orang menyukai pesan: (:Person)-[:likes]->(<:Message)

Lokasi geografis (isLocatedIn):

  • Orang-orang tinggal di kota: (:Person)-[:isLocatedIn]->(:City)
  • Universitas yang berlokasi di kota: (:University)-[:isLocatedIn]->(:City)
  • Perusahaan yang berlokasi di negara/wilayah: (:Company)-[:isLocatedIn]->(:Country)
  • Postingan yang berlokasi di negara/wilayah: (:Post)-[:isLocatedIn]->(:Country)
  • Komentar yang terletak di negara/wilayah: (:Comment)-[:isLocatedIn]->(:Country)

Batasan kunci

Setiap jenis node memiliki batasan kunci yang sesuai yang memastikan identifikasi unik berdasarkan id properti:

  • tag_class_pk, , tag_pkplace_pk, organization_pk, person_pk, , forum_pk,message_pk