ตัวอย่างเค้าร่าง GQL: เครือข่ายทางสังคม

บทความนี้มีข้อกําหนดทางเทคนิคที่สมบูรณ์สําหรับกราฟประเภทเครือข่ายสังคมที่ใช้ตลอดทั้งเอกสารประกอบ GQL Schema นี้แสดงให้เห็นถึงคุณลักษณะทั่วไปจํานวนมากของกราฟที่ซับซ้อนและทําหน้าที่เป็นพื้นฐานสําหรับตัวอย่างคิวรีทั้งหมดในเอกสารภาษา GQL

นิยามนี้ใช้ไวยากรณ์แบบกราฟ GQL อย่างเป็นทางการเป็นการอ้างอิง และไม่สามารถรันได้โดยตรงใน Graph หากต้องการสร้างกราฟผ่านประสบการณ์ Fabric ที่รองรับ ดูที่ การออกแบบกราฟสคีมา สําหรับคําอธิบายไวยากรณ์ในตัวอย่างนี้ ดูที่ GQL graph types

Note

ตัวอย่างเครือข่ายสังคมมาจาก LDBC SNB (LDBC Social Network Benchmark) ที่เผยแพร่โดย GDC (Graph Data Council)

สําหรับข้อมูลเพิ่มเติม โปรดดูบทความ "มาตรฐานเครือข่ายทางสังคมของ LDBC" สําหรับข้อมูลเกี่ยวกับวิธีการขอรับสําเนาของชุดข้อมูลที่ได้รับให้ดูชุดข้อมูลกราฟตัวอย่างเครือข่ายสังคม

แผนภาพที่แสดงเค้าร่างเครือข่ายสังคมออนไลน์

ข้อกําหนดโดเมน

แบบจําลองโดเมนเครือข่ายสังคมออนไลน์ที่ครอบคลุมแพลตฟอร์มโซเชียลด้วยเอนทิตีต่อไปนี้:

  • บุคคล ที่มีคุณสมบัติข้อมูลประชากรและพฤติกรรม
  • องค์กรต่าง ๆ รวมถึงสถาบันการศึกษา (มหาวิทยาลัย) และนายจ้าง (บริษัท)
  • ลําดับชั้นทางภูมิศาสตร์ จากเมืองผ่านประเทศ/ภูมิภาคไปยังทวีป
  • ระบบเนื้อหา ที่มีฟอรัม โพสต์ และข้อคิดเห็นแบบเธรด
  • ระบบการจัด หมวดหมู่ที่มีแท็กและการจัดประเภทแท็ก
  • ความสัมพันธ์ทางสังคมและระดับมืออาชีพ ระหว่างบุคคลและองค์กร

สําหรับข้อมูลเกี่ยวกับตารางต้นทางและข้อมูล ดูที่ชุดข้อมูลเครือข่ายสังคม

สาธิตคุณลักษณะ Schema

กราฟชนิดนี้แสดงความสามารถ GQL ขั้นสูง:

  • การสืบทอดชนิดโหนด โดยใช้ชนิดฐานนามธรรม (Message, Organization, Place)
  • รูปแบบการสืบทอดหลายรายการ ที่มีข้อกําหนดคุณสมบัติที่ใช้ร่วมกัน
  • กลุ่มประเภทขอบ ที่ป้ายความสัมพันธ์เดียวกันเชื่อมต่อชุดประเภทของโหนดที่แตกต่างกัน
  • ระบบข้อจํากัดที่ครอบคลุม ทําให้เกิดความสมบูรณ์ของข้อมูลผ่านข้อจํากัดหลัก
  • รูปแบบความสัมพันธ์แบบผสม รวมถึงการจํากัดขอบเขตแบบลําดับชั้น การเชื่อมต่อทางสังคม และการโต้ตอบกับเนื้อหา

ทําข้อกําหนด Schema ให้เสร็จสมบูรณ์

ชนิดกราฟต่อไปนี้มีข้อกําหนด Schema ที่สมบูรณ์ในไวยากรณ์ 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)

การวิเคราะห์ Schema

ลําดับชั้นของชนิดโหนด

Schema จะกําหนดลําดับชั้นการสืบทอดสามรายการ:

ลําดับชั้นทางภูมิศาสตร์:

  • Place(บทคัดย่อ) → City, CountryContinent

ลําดับชั้นขององค์กร:

  • Organization (นามธรรม) → University, Company

ลําดับชั้นเนื้อหา:

  • Message (นามธรรม) → Post, Comment

กลุ่มประเภทขอบ

ป้ายขอบหลายประเภทกลุ่มรูปแบบการเชื่อมต่อชุดโหนดที่แตกต่างกัน:

ความสัมพันธ์ของตําแหน่งที่ตั้ง (isPartOf):

  • เมืองอยู่ในประเทศ/ภูมิภาค: (:City)-[:isPartOf]->(:Country)
  • ประเทศ/ภูมิภาคเป็นของทวีป: (:Country)-[:isPartOf]->(:Continent)

การโต้ตอบกับเนื้อหา (likes):

  • ผู้คนชอบโพสต์: (:Person)-[:likes]->(:Post)
  • บุคคลเช่นความคิดเห็น: (:Person)-[:likes]->(:Comment)
  • คนชอบข้อความ: (:Person)-[:likes]->(<:Message)

ตําแหน่งที่ตั้งทางภูมิศาสตร์ (isLocatedIn):

  • ผู้คนอาศัยอยู่ในเมือง: (:Person)-[:isLocatedIn]->(:City)
  • มหาวิทยาลัยในเมือง: (:University)-[:isLocatedIn]->(:City)
  • บริษัทที่อยู่ในประเทศ/ภูมิภาค: (:Company)-[:isLocatedIn]->(:Country)
  • โพสต์ที่ตั้งอยู่ในประเทศ/ภูมิภาค: (:Post)-[:isLocatedIn]->(:Country)
  • ความคิดเห็นที่อยู่ในประเทศ/ภูมิภาค: (:Comment)-[:isLocatedIn]->(:Country)

ข้อจํากัดหลัก

โหนดทุกชนิดมีข้อจํากัดคีย์ที่สอดคล้องกันเพื่อให้มั่นใจว่าการระบุที่ไม่ซ้ํากันตาม id คุณสมบัติ:

  • tag_class_pk, tag_pk, place_pk, organization_pk, person_pk, , forum_pkmessage_pk