[Today I Learn][20-03-2020] Sử dụng multiple language tags trong Dgraph
Bài đăng này đã không được cập nhật trong 4 năm
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ớicomment node
thông qua cạnhreview
- Tất cả các
food node
liên kết vớicountry node
thông qua cạnhorigin
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 node
và country 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",
"comment@jp": "とても美味しい",
"comment@ru": "очень вкусно"
}
],
"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
comment@ru
là comment bằng tiếng Ngacomment@ja
là comment bằng tiếng Nhậtcomment
mặc định bằng tiếng Anh
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 {
comment@jp
}
}
}
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 {
comment@*
}
}
}
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
All rights reserved