Schema & Structured Data

hasPart / isPartOf

Thuộc tính schema.org biểu diễn quan hệ phân chia (hasPart) hoặc thành phần (isPartOf) giữa các thực thể.

4 lượt xem Cập nhật: 31/05/2026

hasPart / isPartOf là gì?

hasPartisPartOf là hai thuộc tính quan hệ trong chuẩn Schema.org, dùng để mô tả mối liên hệ phân chia giữa các thực thể: một thực thể chứa (hasPart) hoặc thuộc về (isPartOf) một thực thể khác. Đây là cặp thuộc tính nghịch đảo — nếu A hasPart B thì B isPartOf A.

Ví dụ: Một cuốn sách có nhiều chương → cuốn sách hasPart chương 1; đồng thời, chương 1 isPartOf cuốn sách. Cặp thuộc tính này không chỉ áp dụng cho nội dung văn bản mà còn dùng được với sản phẩm (bộ máy → chi tiết), sự kiện (hội nghị → phiên thảo luận), tổ chức (tập đoàn → chi nhánh), hay địa điểm (khu du lịch → khu vui chơi).

Tại sao quan trọng trong SEO?

Các công cụ tìm kiếm như Google không trực tiếp xếp hạng trang dựa trên hasPart/isPartOf, nhưng chúng dùng dữ liệu cấu trúc để hiểu sâu hơn về ngữ cảnh, mức độ liên kết và tính toàn vẹn của nội dung. Khi triển khai đúng, cặp thuộc tính này giúp:

  • Tăng khả năng hiển thị trong các tính năng nâng cao như rich results dạng tập hợp (ví dụ: danh sách chương sách trong kết quả tìm kiếm);
  • Hỗ trợ lập chỉ mục chính xác hơn cho nội dung phân mảnh (như bài viết dài chia thành nhiều phần, mỗi phần có URL riêng);
  • Cải thiện khả năng liên kết nội bộ theo ngữ nghĩa — giúp bot nhận diện đâu là phần mở rộng, đâu là tổng quan;
  • Phục vụ tốt hơn cho các hệ thống AI và trợ lý giọng nói khi cần trả lời câu hỏi dạng "Chương 3 của cuốn X nằm ở đâu?".

Lưu ý: Không có bằng chứng nào cho thấy việc dùng hasPart/isPartOf làm tăng thứ hạng trực tiếp. Tuy nhiên, nó là một phần của chiến lược dữ liệu cấu trúc toàn diện — góp phần xây dựng Knowledge Graph đáng tin cậy cho trang web của bạn.

Cách hoạt động

Hai thuộc tính này hoạt động dựa trên nguyên tắc liên kết ngữ nghĩa hai chiều. Chúng không yêu cầu giá trị bắt buộc phải là URL — có thể là ID, tên, hoặc đối tượng JSON-LD đầy đủ. Tuy nhiên, để bot hiểu rõ nhất, nên trỏ đến một @id hoặc URL có schema tương ứng.

Google hiện chưa hỗ trợ hiển thị rich snippet riêng biệt cho hasPart/isPartOf, nhưng các hệ thống như Bing, Yandex và công cụ phân tích dữ liệu cấu trúc (Schema Markup Validator, Rich Results Test) đều nhận diện và kiểm tra tính nhất quán của cặp quan hệ này.

Hướng dẫn thực hiện

Dưới đây là các bước triển khai an toàn và hiệu quả:

  1. Xác định rõ thực thể cha – con: Ví dụ: Trang chủ “Giới thiệu công ty” là thực thể cha; các trang “Sơ đồ tổ chức”, “Lịch sử hình thành”, “Tầm nhìn – sứ mệnh” là các phần con.
  2. Chọn định dạng dữ liệu cấu trúc: Ưu tiên JSON-LD (được Google khuyến nghị). Không dùng Microdata hoặc RDFa nếu không cần thiết.
  3. Đặt hasPart ở thực thể cha: Gán mảng các @id hoặc đối tượng con vào thuộc tính hasPart.
  4. Đặt isPartOf ở thực thể con: Mỗi trang con trỏ ngược lại @id của trang cha.
  5. Kiểm tra tính đối xứng: Dùng Rich Results Test hoặc Schema Markup Validator để đảm bảo không bị lỗi “orphaned part” (phần không có nơi thuộc về).

Lỗi thường gặp

Lỗi Mô tả Cách khắc phục
hasPart thiếu isPartOf tương ứng Một trang được khai báo là phần của thực thể cha, nhưng trang đó không khai báo isPartOf trở lại. Thêm "isPartOf": {"@id": "https://example.com/cha"} vào JSON-LD của trang con.
Sử dụng giá trị chuỗi thay vì đối tượng Gán hasPart: "https://example.com/chuong1" thay vì hasPart: {"@id": "https://example.com/chuong1"}. Luôn dùng đối tượng JSON với @id — trừ khi schema cho phép giá trị đơn giản (rất hiếm, tùy trường hợp).
Liên kết vòng lặp (circular reference) A hasPart B, B hasPart C, C isPartOf A — gây khó khăn cho trình phân tích. Tránh thiết lập quan hệ ba chiều trở lên; giữ cấu trúc cây rõ ràng: một phần chỉ thuộc về một thực thể cha duy nhất.

Ví dụ thực tế

Dưới đây là đoạn JSON-LD cho một khóa học online gồm 5 chương, mỗi chương có URL riêng:

{ "@context": "https://schema.org", "@type": "Course", "@id": "https://khoahoc.example.com/lap-trinh-web", "name": "Lập trình web từ cơ bản", "hasPart": [ {"@id": "https://khoahoc.example.com/chuong-1"}, {"@id": "https://khoahoc.example.com/chuong-2"}, {"@id": "https://khoahoc.example.com/chuong-3"} ] }

Và tại trang /chuong-1:

{ "@context": "https://schema.org", "@type": "CourseInstance", "@id": "https://khoahoc.example.com/chuong-1", "name": "Chương 1: HTML cơ bản", "isPartOf": { "@id": "https://khoahoc.example.com/lap-trinh-web" } }

Lưu ý: Loại @type ở phần con không bắt buộc phải giống cha — miễn là có quan hệ rõ ràng và hợp lý theo ngữ nghĩa (ví dụ: CourseChapter, WebPage, VideoObject… đều được chấp nhận).

Câu hỏi thường gặp

Google có hiển thị rich result từ hasPart/isPartOf không?

Hiện tại (tháng 6/2024), Google không hỗ trợ rich result riêng cho cặp thuộc tính này. Tuy nhiên, dữ liệu vẫn được thu thập và dùng để cải thiện hiểu biết về cấu trúc nội dung — đặc biệt trong các truy vấn tìm kiếm theo phần, hoặc khi người dùng hỏi qua Assistant.

Có bắt buộc phải dùng cả hai thuộc tính không?

Không bắt buộc — nhưng khuyến nghị dùng cả hai để đảm bảo tính nhất quán và dễ kiểm tra. Nếu chỉ dùng hasPart, bot có thể không xác định được đâu là “phần gốc”. Nếu chỉ dùng isPartOf, sẽ thiếu ngữ cảnh tổng quan. Việc kết hợp giúp tạo ra mạng lưới dữ liệu có độ tin cậy cao hơn.

Có thể dùng hasPart cho nội dung ngoài website không?

Có thể — miễn là thực thể được tham chiếu có schema hợp lệ và có thể truy cập (public URL hoặc @id được định nghĩa rõ). Ví dụ: Một bài báo trên trang bạn hasPart một đoạn phỏng vấn đăng trên kênh YouTube — nếu video đó có schema VideoObject và URL công khai, việc liên kết là hợp lệ. Tuy nhiên, hiệu quả phụ thuộc vào khả năng trích xuất dữ liệu của bot — có thể thay đổi theo thời gian và nền tảng.