Quy tắc biểu thức logic

Chương này giới thiệu cách viết các biểu thức điều kiện truy vấn.

Tổng quan

Một biểu thức tiên đề trả về một giá trị boolean. Milvus sử dụng các tiên đề để lọc các số vô hướng. Khi đánh giá một biểu thức tiên đề, nó sẽ trả về TRUE hoặc FALSE. Vui lòng tham khảo tài liệu API SDK Python để biết hướng dẫn sử dụng các biểu thức tiên đề.

Toán tử

Toán tử Logic

Các toán tử logic so sánh hai biểu thức.

Ký hiệu Phép toán Ví dụ Mô tả
'and' && expr1 && expr2 Trả về True khi cả expr1 và expr2 đều đúng.
'or' || HOẶC expr1 || expr2 Trả về True khi either expr1 hoặc expr2 đúng.

Toán tử Số học Nhị phân

Các toán tử số học nhị phân lấy hai toán hạng và thực hiện các phép toán cơ bản, trả về kết quả tương ứng.

Ký hiệu Phép toán Ví dụ Mô tả
+ Cộng a + b Cộng hai toán hạng với nhau.
- Trừ a - b Trừ toán hạng thứ hai từ toán hạng thứ nhất.
* Nhân a * b Nhân hai toán hạng.
/ Chia a / b Chia toán hạng thứ nhất cho toán hạng thứ hai.
** Lũy thừa a ** b Đưa toán hạng thứ nhất lên số mũ của toán hạng thứ hai.
% Phần dư a % b Chia toán hạng thứ nhất cho toán hạng thứ hai và trả về phần dư.

Toán tử Quan hệ

Các toán tử quan hệ sử dụng ký hiệu để kiểm tra sự bằng nhau, khác nhau, hoặc thứ tự tương đối giữa hai biểu thức.

Ký hiệu Phép toán Ví dụ Mô tả
< Nhỏ hơn a < b Trả về True nếu a nhỏ hơn b.
> Lớn hơn a > b Trả về True nếu a lớn hơn b.
== Bằng a == b Trả về True nếu a bằng b.
!= Không bằng a != b Trả về True nếu a không bằng b.
<= Nhỏ hơn hoặc bằng a <= b Trả về True nếu a nhỏ hơn hoặc bằng b.
>= Lớn hơn hoặc bằng a >= b Trả về True nếu a lớn hơn hoặc bằng b.

Thứ tự Ưu tiên và Tính liên kết của Toán tử

Bảng dưới đây liệt kê thứ tự ưu tiên và tính liên kết của các toán tử. Các toán tử được liệt kê theo thứ tự ưu tiên từ trên xuống dưới.

Ưu tiên Toán tử Mô tả Tính liên kết
1 + - Toán tử số học một ngôi Từ trái sang phải
2 not Toán tử logic một ngôi Từ phải sang trái
3 ** Toán tử số học nhị phân Từ trái sang phải
4 * / % Toán tử số học nhị phân Từ trái sang phải
5 + - Toán tử số học nhị phân Từ trái sang phải
6 < <= > >= Các toán tử so sánh Từ trái sang phải
7 == != Các toán tử so sánh Từ trái sang phải
8 like LIKE Toán tử khớp Từ trái sang phải
9 json_contains JSON_CONTAINS Toán tử JsonArray Từ trái sang phải
10 json_contains_all JSON_CONTAINS_ALL Toán tử JsonArray Từ trái sang phải
11 json_contains_any JSON_CONTAINS_ANY Toán tử JsonArray Từ trái sang phải
12 && and Toán tử logic nhị phân Từ trái sang phải
13 || or Toán tử logic nhị phân Từ trái sang phải

Biểu thức thường được đánh giá từ trái sang phải. Các biểu thức phức tạp được đánh giá lần lượt. Thứ tự đánh giá của các biểu thức được xác định bởi sự ưu tiên của các toán tử sử dụng.

Nếu một biểu thức chứa hai hoặc nhiều toán tử có cùng sự ưu tiên, toán tử ở bên trái nhất được đánh giá trước.

Ví dụ, 10 / 2 * 5 sẽ được đánh giá như là (10 / 2) và kết quả sẽ được nhân với 5.

Khi cần ưu tiên các phép toán ưu tiên thấp hơn, chúng nên được đặt trong dấu ngoặc đơn.

Ví dụ, 30 / 2 + 8. Thông thường sẽ được tính là 30 chia cho 2, và sau đó cộng thêm 8 vào kết quả. Nếu muốn chia cho 2 + 8, nó nên được viết là 30 / (2 + 8).

Dấu ngoặc có thể được lồng trong một biểu thức. Dấu ngoặc ở bên trong cùng được đánh giá trước.

Điều kiện ví dụ

Dưới đây là một số ví dụ về tất cả các biểu thức boolean có sẵn trong Milvus (int64 đại diện cho một trường scalar chứa dữ liệu kiểu INT64, float đại diện cho một trường scalar chứa dữ liệu kiểu số thực, và VARCHAR đại diện cho một trường scalar chứa dữ liệu kiểu VARCHAR):

  1. Biểu thức so sánh
"int64 > 0"
"0 < int64 < 400"
"500 < int64"
VARCHAR > "str1"
  1. Các phép toán logic và dấu ngoặc
"(int64 > 0 && int64 < 400) hoặc (int64 > 500 && int64 < 1000)"
  1. Biểu thức in

Milvus chỉ hỗ trợ xóa các thực thể có khóa chính được xác định một cách rõ ràng, điều này chỉ có thể được thực hiện thông qua biểu thức điều kiện in.

"int64 not in [1, 2, 3]"
VARCHAR not in ["str1", "str2"]
  1. TermExpr, BinaryLogicalOp, và CmpOp (trên các trường khác nhau)
"int64 in [1, 2, 3] và float != 2"
  1. BinaryLogicalOp và CmpOp
"int64 == 0 hoặc int64 == 1 hoặc int64 == 2"
  1. CmpOp và UnaryArithOp hoặc BinaryArithOp
"200+300 < int64"
  1. MatchOp (khớp tiền tố)
VARCHAR like "tiền_tố%"
  1. JsonArrayOp
  • JSON_CONTAINS(identifier, JsonExpr)

    Nếu biểu thức JSON trong câu lệnh JSON_CONTAINS (tham số thứ hai) là một danh sách, thì identifier (tham số đầu tiên) phải là một danh sách các danh sách. Nếu không, câu lệnh luôn luôn được đánh giá là Sai.

json_contains(x, 1) # ==> đúng
json_contains(x, "a") # ==> sai

json_contains(x, [1,2,3]) # ==> đúng
json_contains(x, [3,2,1]) # ==> sai
  • JSON_CONTAINS_ALL(identifier, JsonExpr)

    Biểu thức JSON trong câu lệnh JSON_CONTAINS_ALL luôn phải là một danh sách.

json_contains_all(x, [1,2,8]) # ==> đúng
json_contains_all(x, [4,5,6]) # ==> sai (6 không tồn tại)
  • JSON_CONTAINS_ANY(identifier, JsonExpr)

    Biểu thức JSON trong câu lệnh JSON_CONTAINS_ANY luôn phải là một danh sách. Nếu không, hành vi của nó giống như JSON_CONTAINS.

json_contains_any(x, [1,2,8]) # ==> đúng
json_contains_any(x, [4,5,6]) # ==> đúng
json_contains_any(x, [6,9]) # ==> sai