[Today I Learn][20-03-2020] Sử dụng multiple language tags trong Dgraph

Lý do có series này

Đơn giản là muốn nhờ Viblo note lại những kiến thức học được trong một ngày thôi. Đây không phải là các bài blog chia sẻ hoàn chỉnh nên mọi người có thể không cần để ý đến nó

String và languages tags

Tất cả các predicate kiểu string trong Dgraph đều được encode với UTF-8. Dgraph cũng support giá trị cho string với nhiều ngôn ngữ khác nhau. Khả năng đa ngôn ngữ đặc biệt hữu ích để xây dựng các tính năng, đòi hỏi chúng ta phải lưu trữ cùng một thông tin bằng nhiều ngôn ngữ. Build thử một graph cho ứng dụng review thực ăn đơn giản với các thành phần như sau:

Graph phía trên bao gồm 3 thực thể là Food, Country và Comment và các liên hệ như sau:

  • Tất cả các food node liên kết với comment node thông qua cạnh review
  • Tất cả các food node liên kết với country node thông qua cạnh origin

Add thử một vài dữ liệu

{
  "set": [
    {
      "food_name": "Hamburger",
      "review": [
        {
          "comment": "Tastes very good"
        }
      ],
      "origin": [
        {
          "country": "United states of America"
        }
      ]
    },
    {
      "food_name": "Carrillada",
      "review": [
        {
          "comment": "Sabe muy sabroso"
        }
      ],
      "origin": [
        {
          "country": "Spain"
        }
      ]
    },
    {
      "food_name": "Pav Bhaji",
      "review": [
        {
          "comment": "स्वाद बहुत अच्छा है"
        }
      ],
      "origin": [
        {
          "country": "India"
        }
      ]
    },
    {
      "food_name": "Borscht",
      "review": [
        {
          "comment": "очень вкусно"
        }
      ],
      "origin": [
        {
          "country": "Russia"
        }
      ]
    },
    {
      "food_name": "mapo tofu",
      "review": [
        {
          "comment": "真好吃"
        }
      ],
      "origin": [
        {
          "country": "China"
        }
      ]
    }
  ]
}

Ta thu được graph như sau

Trong đó có 5 node xanh dương là food node, các node màu xanh lá biểu diễn country node và các node màu hồng biểu diễn review node

Giờ bật thử sang tab Schema để xem các kiểu dữ liệu đã được tự động detected

Chúng ta querry tất cả các food node kèm theo review nodecountry node tương ứng

{
  food_review(func: has(food_name)) {
    food_name
      review {
        comment
      }
      origin {
        country
      }
  }
}

Và thu được kết quả như sau

Các comment đã ở những ngôn ngữ khác nhau. Bây giờ lại muốn lấy tất cả các comment base trên ngôn ngữ nhất định. Ví dụ muốn lấy tất cácr comment bằng tiếng Nhật thì cần phải thêm một cái gọi là language tags

Thêm một vài dữ liệu với language tags

{
  "set": [
    {
      "food_name": "Sushi",
      "review": [
        {
          "comment": "Tastes very good",
          "[email protected]": "とても美味しい",
          "[email protected]": "очень вкусно"
        }
      ],
      "origin": [
        {
          "country": "Japan"
        }
      ]
    }
  ]
}

Sử dụng language tags với cú pháp @tag sau tên của predicate tương ứng. Ví dụ như trên

Khi chạy thử thì sẽ thấy báo lỗi

Lỗi này do chưa cho phép predicate comment nhận chỉ thị ngôn ngữ. Vào trong Schema setting lại thì sẽ thêm được bình thường

Chú ý:

  • Ví dụ trên add 1 comment nhưng cho 3 ngôn ngữ khác nhau chứ không phải là 3 comment khác nhau
  • Có thể sử dung bất kì kí hiệu nào cho language tags tuy nhiên khuyến khích sử dụng theo ISO Standard code tại đây

Truy vấn sử dụng language tags

Muốn sử dụng truy vấn trên string trước tiến cần phải add index vào các predicate cần truy vấn đã. Ở đây là food_name

Sau đó để query với một language tags thì sử dụng câu truy vấn như sau

{
  food_review(func: eq(food_name,"Sushi")) {
    food_name
    review {
      [email protected]
    }
  }
}

Thu được kết quả

Để query tất cả comment bằng các ngôn ngữ khác nhau

{
  food_review(func: eq(food_name,"Sushi")) {
    food_name
    review {
      [email protected]*
    }
  }
}

Thu được kết quả như sau

Một vài kiểu query với lanuage tags khác được mô tả trong bảng sau

Bình luận

  • Nhìn chung khá dễ dàng để triển khai đa ngôn ngữ
  • Cú pháp dễ dùng
  • Chưa có nhiều thứ mới lạ lắm, hi vọng sẽ tìm thấy trong bài tiếp theo của Dgraph Docs