โครงสร้างของข้อมูล
เพื่อให้ฐานข้อมูลเป็นระเบียบ มีมาตรฐาน และเข้าใจง่าย เราได้ออกแบบ โครงสร้างของข้อมูล (schema) เพื่อกำหนดว่า node กี่ประเภท ในแต่ละประเภทมี property อะไร และ node เหล่านั้นสามารถเชื่อมต่อกันเพื่อสร้างความสัมพันธ์อย่างไรได้บ้าง
เราออกแบบ schema ของ Politigraph จาก Popolo - International open government data specifications พร้อมกับการปรับปรุงให้เข้ากับ context ของประเทศไทย ซึ่ง schema จะประกอบด้วย
- Object: ประเภทของ node ข้อมูลจริง พร้อมระบุ property ที่มีใน node ประเภทนั้นๆ
- Interface: ประเภทที่เป็นข้อกำหนดพื้นฐานให้ประเภทอื่นๆ นำไปใช้ต่อ
- Union: เซ็ตของประเภทที่เป็นไปได้
- Relationship: ความสัมพันธ์ที่เป็นไปได้ระหว่าง node ประเภทต่างๆ
ลองเลือก entity ต่างๆ เพื่ออ่านคำอธิบาย
ยกตัวอย่างเช่น เรามีข้อมูลของคนที่มีชื่อขึ้นต้นด้วยคำว่า “ณัฐ” เป็น node ประเภท Person ดังนั้นทั้งสามคน จะมี property และ relationship มากกว่าตามที่กำหนดไว้ใน Person schema ไม่ได้ (แต่ไม่มี property ที่ไม่ได้บังคับได้ ในกรณีนี้ property นั้นๆ จะมีค่าเป็น null)
บุคคลที่เกี่ยวข้องทางการเมือง เช่น สมาชิกสภา สมาชิกพรรคการเมือง ฯลฯ
- id: 2e66ac25-2345-4a18-b143-be0ccbba4f9c
- prefix: พลเอก
- name: ณัฐ อินทรเจริญ
- image: https://politigraph.wevis.info/assets/people/ณัฐ-อินทรเจริญ.webp
- birth_date: 1961-01-09
- educations: - สถาบันทหาร วิทยาศาสตรบัณฑิต (การทหาร) โรงเรียนนายร้อยพระจุลจอมเกล้า
- previous_occupations: - ปลัดกระทรวงกลาโหม - สมาชิกสภานิติบัญญัติแห่งชาติ (สนช.)
*Only showing nodes, properties, and relationships from the query see full schema
query People($where: PersonWhere) { people(where: $where) { id prefix name image birth_date educations previous_occupations }}{ "where": { "firstname_STARTS_WITH": "ณัฐ" }}{ "data": { "people": [ { "__typename": "Person", "id": "2e66ac25-2345-4a18-b143-be0ccbba4f9c", "prefix": "พลเอก", "name": "ณัฐ อินทรเจริญ", "image": "https://politigraph.wevis.info/assets/people/ณัฐ-อินทรเจริญ.webp", "birth_date": "1961-01-09", "educations": "- สถาบันทหาร วิทยาศาสตรบัณฑิต (การทหาร) โรงเรียนนายร้อยพระจุลจอมเกล้า", "previous_occupations": "- ปลัดกระทรวงกลาโหม\n- สมาชิกสภานิติบัญญัติแห่งชาติ (สนช.)" }, { "__typename": "Person", "id": "8866cde7-1515-4dc4-901a-70b8e1c324c3", "prefix": "นาย", "name": "ณัฐกิตติ์ หนูรอด", "image": "https://politigraph.wevis.info/assets/people/ณัฐกิตติ์-หนูรอด.webp", "birth_date": null, "educations": "", "previous_occupations": "" }, { "__typename": "Person", "id": "1f30f03a-4d63-4705-a34b-594f616d0015", "prefix": "นางสาว", "name": "ณัฐจิรา อิ่มวิเศษ", "image": null, "birth_date": null, "educations": "- ปริญญาโท คณะบริหารธุรกิจ มหาวิทยาลัยศิลปากร\n- ปริญญาตรี คณะบริหารธุรกิจ มหาวิทยาลัยเกษตรศาสตร์", "previous_occupations": "- อดีตที่ปรึกษาคณะกรรมาธิการกิจการเด็ก เยาวชน สตรี ผู้สูงอายุ ผู้พิการ กลุ่มชาติพันธุ์ และผู้มีความหลากหลายทางเพศ\n- ธุรกิจส่วนตัว" }, { "__typename": "Person", "id": "1afd00e0-1e07-4d48-9d77-94ab505f8b7e", "prefix": "นาย", "name": "ณัฐชา บุญไชยอินสวัสดิ์", "image": "https://politigraph.wevis.info/assets/people/ณัฐชา-บุญไชยอินสวัสดิ์.webp", "birth_date": "1990-04-11", "educations": "- ประกาศนียบัตรวิชาชีพชั้นสูง (ปวส.) วิทยาลัยเทคโนโลยีสยาม", "previous_occupations": "- นักธุรกิจ" }, { "__typename": "Person", "id": "c0f498fe-e246-4543-981c-27f3c9ce92e7", "prefix": "นาย", "name": "ณัฐพงศ์ เปรมพูลสวัสดิ์", "image": null, "birth_date": null, "educations": "- ปริญญาโท การจัดการสิ่งแวดล้อมเมือง สถาบันเอไอที (ทุนรัฐบาลไทย)\n- ปริญญาตรี การผังเมือง ม.ธรรมศาสตร์ (เกียรตินิยมอันดับ 2)", "previous_occupations": "- นักผังเมือง\n- นักวิจัยด้านคมนาคมขนส่งและโลจิสติกส์ สถาบันวิจัยทีดีอาร์ไอ\n- ผู้ช่วยดำเนินงานของสมาชิกสภาผู้แทนราษฎร พรรคก้าวไกล (สุรเชษฐ์ ประวีณวงศ์วุฒิ)\n- คณะทำงานติดตามสถานการณ์น้ำ พรรคก้าวไกล\n- เลขานุการประจำคณะกรรมาธิการศึกษาการจัดทำและติดตามการบริหารงบประมาณ สภาผู้แทนราษฎร" }, { "__typename": "Person", "id": "befcc3d0-fc32-4836-9d71-1c16ee647782", "prefix": "นาย", "name": "ณัฐพงษ์ พิพัฒน์ไชยศิริ", "image": null, "birth_date": null, "educations": "- มัธยมศึกษาตอนปลาย Broad Run High School VA สหรัฐอเมริกา\n- ปริญญาตรี วิทยาลัยนานาชาติ", "previous_occupations": "" }, { "__typename": "Person", "id": "468d76e2-cd67-4ee9-8f2a-043a28ef995f", "prefix": "นาย", "name": "ณัฐพงษ์ สุปริยศิลป์", "image": "https://politigraph.wevis.info/assets/people/ณัฐพงษ์-สุปริยศิลป์.webp", "birth_date": "1977-12-23", "educations": "- ปริญญาโท Master of Commerce (International Business) Deakin University, Australia", "previous_occupations": "- สมาชิกสภาผู้แทนราษฎร" }, { "__typename": "Person", "id": "adad2e16-ec2e-4bf4-8f36-6202c22c46da", "prefix": "นาย", "name": "ณัฐพงษ์ สุมโนธรรม", "image": null, "birth_date": null, "educations": "- ปริญญาตรี รัฐศาสตร์บัณฑิต การเมืองการปกครอง (เกียรตินิยมอันดับ 2) มหาวิทยาลัยธรรมศาสตร์\n- มัธยมศึกษา โรงเรียนสวนกุหลาบวิทยาลัย รุ่น 131", "previous_occupations": "- โฆษกคณะกรรมาธิการพิจารณา ร่าง พ.ร.บ. แก้ไขเพิ่มเติม พ.ร.ก.ประมง พ.ศ. 2558\n- ผู้จัดการรณรงค์ทางการเมือง คณะก้าวหน้า แคมเปญขอคนละชื่อปลดล็อกท้องถิ่น\n- อดีตทีมผู้ช่วยเลขาธิการคณะก้าวหน้า ปิยบุตร แสงกนกกุล\n- อดีตทีมสื่อสารพรรคก้าวไกล\n- อดีตผู้ช่วยหัวหน้าพรรคก้าวไกล พิธา ลิ้มเจริญรัตน์" }, { "__typename": "Person", "id": "d45582fa-6595-4aec-ba71-8cbc3a37013d", "prefix": "นาย", "name": "ณัฐพงษ์ เรืองปัญญาวุฒิ", "image": "https://politigraph.wevis.info/assets/people/ณัฐพงษ์-เรืองปัญญาวุฒิ.webp", "birth_date": "1987-05-18", "educations": "- ปริญญาตรี วิศวกรรมศาสตรบัณฑิต (วิศวกรรมคอมพิวเตอร์) จุฬาลงกรณ์มหาวิทยาลัย", "previous_occupations": "- นักธุรกิจ" }, { "__typename": "Person", "id": "a5162c19-b39d-44a3-83a1-a54778dc622c", "prefix": "พลเอก", "name": "ณัฐพล นาคพาณิชย์", "image": "https://politigraph.wevis.info/assets/people/ณัฐพล-นาคพาณิชย์.webp", "birth_date": null, "educations": "", "previous_occupations": "" }, { "__typename": "Person", "id": "d456e242-dc03-42cf-b512-00f9a275537b", "prefix": "นาย", "name": "ณัฐพล สืบศักดิ์วงศ์", "image": "https://politigraph.wevis.info/assets/people/ณัฐพล-สืบศักดิ์วงศ์.webp", "birth_date": "1965-01-13", "educations": "- ปริญญาตรี มหาวิทยาลัยรามคำแหง", "previous_occupations": "- เกษตรกร" }, { "__typename": "Person", "id": "db6c21ed-25bc-4969-9417-76e58ded5d11", "prefix": "นาย", "name": "ณัฐพล โตวิจักษณ์ชัยกุล", "image": null, "birth_date": "1988-08-22", "educations": "- มัธยมศึกษา โรงเรียนมงฟอร์ตวิทยาลัย จังหวัดเชียงใหม่ - ปริญญาตรี คณะบริหารธุรกิจ มหาวิทยาลัยเชียงใหม่ - ปริญญาโท ด้านบริหารธุรกิจ มหาวิทยาลัยแคลิฟอร์เนีย ลูเธอรัน ประเทศสหรัฐอเมริกา", "previous_occupations": "- ธุรกิจส่วนตัว" }, { "__typename": "Person", "id": "34b0f2a0-5772-425a-bbc5-44417fbdf958", "prefix": "นาย", "name": "ณัฐวุฒิ กองจันทร์ดี", "image": "https://politigraph.wevis.info/assets/people/ณัฐวุฒิ-กองจันทร์ดี.webp", "birth_date": "1991-12-01", "educations": "- ปริญญาตรี นิติศาสตรบัณฑิต มหาวิทยาลัยรามคำแหง", "previous_occupations": "- ทหารเกณฑ์" }, { "__typename": "Person", "id": "f015fd7f-8a7e-42c1-a551-8412bcf8fbb3", "prefix": "นาย", "name": "ณัฐวุฒิ บัวประทุม", "image": "https://politigraph.wevis.info/assets/people/ณัฐวุฒิ-บัวประทุม.webp", "birth_date": "1976-05-19", "educations": "- ปริญญาโท นิติศาสตรมหาบัณฑิต (กฎหมายมหาชน) มหาวิทยาลัยรามคำแหง", "previous_occupations": "- นักกฏหมาย" }, { "__typename": "Person", "id": "a34eece6-da03-4f1c-98be-75f9035ee737", "prefix": "นาย", "name": "ณัฐวุฒิ ประเสริฐสุวรรณ", "image": "https://politigraph.wevis.info/assets/people/ณัฐวุฒิ-ประเสริฐสุวรรณ.webp", "birth_date": "1953-12-28", "educations": "- ปริญญาโท Master of Public Administration Roosevelt University, US", "previous_occupations": "- สมาชิกสภาผู้แทนราษฎร" } ] }}Relationship
หัวข้อที่มีชื่อว่า “Relationship”Relationship ใน schema จะมีชื่อเรียกพร้อมกับทิศทางตามหัวลูกศรเพื่อให้เราเข้าใจความสัมพันธ์ เช่น Post--IN--> Organization ทำให้เราเข้าใจว่า Post “อยู่ใน” Organization แต่ในกระบวนการ query ข้อมูล เราสามารถเข้าถึง relationship ได้ทั้งสองฝั่งของลูกศร ยกตัวอย่างเช่น Post มี property organizations และ Organization มี property posts ที่อ้างอิง node ซึ่งอยู่อีกฝั่งของ relationship นี้
องค์กรที่เกี่ยวข้องทางการเมือง เช่น สส. สว. ครม. พรรคการเมือง ฯลฯ
- id: คณะรัฐมนตรี-64
- name: คณะรัฐมนตรี คณะที่ 64
- posts:
- นายกรัฐมนตรี ครม. คณะที่ 64
*Only showing nodes, properties, and relationships from the query see full schema
query Organizations($where: OrganizationWhere, $postsWhere2: PostWhere) { organizations(where: $where) { id name posts(where: $postsWhere2) { id label role organizations { id name } } }}{ "where": { "id_EQ": "คณะรัฐมนตรี-64" }, "postsWhere2": { "role_EQ": "นายกรัฐมนตรี" }}{ "data": { "organizations": [ { "__typename": "Organization", "id": "คณะรัฐมนตรี-64", "name": "คณะรัฐมนตรี คณะที่ 64", "posts": [ { "__typename": "Post", "id": "01c8850b-3d67-4c8c-9993-071b0f4dab0a", "label": "นายกรัฐมนตรี ครม. คณะที่ 64", "role": "นายกรัฐมนตรี", "organizations": [ { "__typename": "Organization", "id": "คณะรัฐมนตรี-64", "name": "คณะรัฐมนตรี คณะที่ 64" } ] } ] } ] }}