Xây dựng các truy vấn quan hệ video dựa trên đồ thị với Apache AGE

Truy vấn tốn kém nhất của chúng tôi là một bảng "hiển thị video liên quan" đơn giản.

Tại ViralVidVault, chúng tôi theo dõi các xu hướng video. Chúng tôi nhận thấy rằng việc tìm kiếm các video liên quan thông qua các kênh chung hoặc các phiên xem cùng nhau đã làm giảm hiệu suất cơ sở dữ liệu của chúng tôi một cách trầm trọng. Chúng tôi đã thử sử dụng SQLite với các phép join đệ quy (recursive joins). Nó hoạt động tốt với một bước nhảy (one hop). Nhưng đến bước nhảy thứ hai, dữ liệu bùng nổ. Một truy vấn đã tạo ra hàng trăm nghìn hàng. Các worker của chúng tôi bắt đầu bị quá thời gian (timeout).

Dữ liệu này là một đồ thị. Chúng tôi đã cố gắng ép nó vào các bảng và phải trả giá đắt.

Chúng tôi đã chuyển lớp quan hệ sang Apache AGE. Đây là một phần mở rộng openCypher cho PostgreSQL. Chúng tôi vẫn giữ nguyên ứng dụng PHP 8.4 và kho lưu trữ SQLite của mình.

Kết quả: • Độ trễ của bảng liên quan giảm từ 900ms xuống dưới 40ms. • Các phép duyệt (traversals) hai bước phức tạp hiện chỉ mất vài mili giây. • Khối lượng công việc vận hành của chúng tôi vẫn giữ nguyên vì AGE chạy bên trong Postgres.

Tại sao nên sử dụng Apache AGE thay vì một cơ sở dữ liệu đồ thị độc lập?

  1. Sự đơn giản trong vận hành Bạn không cần một cơ sở dữ liệu mới để sao lưu hoặc bảo mật. AGE sử dụng thiết lập Postgres, các pool kết nối (connection pools) và các quy tắc bảo mật hiện có của bạn.

  2. Truy vấn đồ thị nguyên bản Trong SQL, các đường dẫn có độ dài biến đổi yêu cầu đệ quy phức tạp. Trong Cypher, bạn viết chúng dưới dạng các mẫu (patterns) đơn giản. Một khối SQL đệ quy dài 40 dòng đã trở thành một truy vấn Cypher chỉ với 6 dòng.

  3. Hiệu suất tốt hơn Một công cụ đồ thị lập chỉ mục cho sự kề cận (adjacency). Nó sẽ dừng mở rộng các đường dẫn không khớp. Điều này ngăn chặn tình trạng bùng nổ dữ liệu (data fan-out) vốn đã làm sập hệ thống trước đây của chúng tôi.

Một bài học then chốt từ quá trình di chuyển của chúng tôi: Luôn lập chỉ mục (index) cho các thuộc tính điểm bắt đầu (entrypoint properties). Nếu bạn không lập chỉ mục cho ID mà bạn sử dụng để bắt đầu một phép duyệt, AGE sẽ thực hiện quét toàn bộ (full scan). Điều này khiến ngay cả truy vấn đồ thị tốt nhất cũng trở nên chậm chạp.

Chúng tôi sử dụng đồ thị như một mô hình đọc (read model). Dữ liệu thô của chúng tôi vẫn nằm trong SQLite. Chúng tôi sử dụng một script Python để đồng bộ hóa cả hai. Điều này giúp đồ thị của chúng tôi nhanh, nhẹ và dễ dàng xây dựng lại.

Nếu các truy vấn SQL đệ quy của bạn đang trở nên quá phức tạp, đừng cố chống lại mô hình quan hệ. Hãy xây dựng một bản chiếu đồ thị (graph projection) nhỏ song song với kho lưu trữ hiện tại của bạn.

Nguồn: https://dev.to/ahmet_gedik778845/building-graph-based-video-relationship-queries-with-apache-age-2p12