文法規則
logical_attribute_expression := attribute_expression logical_operator attribute_expression
logical_operator := AND | OR
relational_attribute_expression := attribute_expression relational_operator attribute_expression
relational_operator := '=' | '>' | '<' | '<=' | '>=' | '!='
arithmatic_attribute_expression := attribute_expression arithmatic_operator attribute_expression | atomic_attribute_expression
arithmatic_operator := '+' | '-'|'*'|'/'
atomic_attribute_expression := attribute_name | number_literal
attribute_name := IDENTIFIER
number_literal := NUMBER
attribute_expression支援數字、string、多實值型別。
string支援所有的關係運算,不支援算術運算。
多實值型別僅支援關係運算中的"="和"!="。
多值的邏輯=的語義:該attribute中包含filter的值。
運算子
+ - * / > < = != >= <= AND OR () @
@
為位與AND
為邏輯與
運算式
功能:封裝查詢過程中的求值邏輯
備忘:所有運算式只支援同類型欄位之間的運算
算術運算式
算術運算式的求值結果是非布爾類型。
簡單變數
:a四則運算
:a + b, a + b - c, a + b / c等常量
: 119
邏輯運算式
邏輯運算式的求值結果是布爾類型。
邏輯運算
AND、OR
a AND b,a OR b
a及b都可以是運算式,如:uid=1000 OR uid=2000
關係運算
><=<=>=!=
a > b, a < b,a = b, a <= b, a >=b
最佳化建議:
一個Query不要超過10個過濾條件;否則,會有很大的效能問題。
同質的過濾條件,可以使用 in/notin/in_string/notin_string 等進行合并
數學函數運算式
三角函數
sin、cos、tan、cot、asin、acos、atab、sinh、cosh、tanh
含義:和c++的數學庫保持一致,不再贅述。
範例:sin(a),其中a是數實值型別運算式
類型轉換函式
to_double、to_int
to_double(a)
含義:返回double類型的a
備忘:a可以是僅包含數字類型的字串運算式
to_int(a)
含義:返回long類型的a
備忘:a可以是僅包含數字類型的字串運算式
數學函數
abs、ln、log10、exp、sqrt、trunc、ceil、floor、round、pow(a, b)
含義:C++的數學庫保持一致
條件函數
if
格式:if(bool_expression, a, b)
含義:如果bool_expression為true,那麼返回a,如果為false,那麼返回b。
備忘
bool_expression的求值結果必須是bool類型
a和b的類型必須保持一致,並且整個函數的傳回值類型和a保持一致。
範例:if(a > 10, b, c)。如果a > 10,返回b,否則返回c。
條件函數
case
格式:case(bool_expression, a, bool_expression, b, c....)
含義:順序判斷哪一個bool_expression為真,則返回它後面那個運算式的值。否則返回最後一個值。
備忘
case運算式必須有奇數個數的參數
a,b,c等的實值型別必須保持一致。
範例:case(a > 20, b, a > 10, c, a > 5, d, e)。如果a > 20,返回b;否則,如果a > 10,返回c;否則,如果a > 5,返回d;否則,返回e。
範圍函數
in、notin、in_string、notin_string
in(a, b) 或者 notin(a, b)
備忘
a可以是任意數值運算式,可以是多值或單值欄位。多值的含義是滿足一個就為true
b必須是常量數實值型別運算式的值的列表,用
|
分割開a和b的常量值的類型必須一致
此運算式返回bool類型
範例:in(nid, "10|12|13"),notin(tag_id, "101|203|405")
這種寫法效能上大優於nid=10 OR nid=20 OR nid=30的寫法
in_string(filed_name, group_condition, separator)
備忘
filed_name是字串運算式
group_condition必須是字串類型運算式的值的列表
separator用於指定的分隔字元。
此運算式返回bool類型
範例:in_string(name, "abc|cde|fgh", "|"),notin_string(tag, "aaa,bbb,ccc", ",")
範圍計數函數
count_in
格式:count_in(a, b)
備忘
a可以是任意數值運算式,可以是多值或單值欄位。多值的含義是滿足一個就計數
b必須是常量數實值型別運算式的值的列表,用
|
分割開a和b的常量值的類型必須一致
此運算式返回整數類型
範例:count_in(nid, "10|13|12|13")
若nid=10,結果為1
若nid=13, 結果為2
若nid=12 13, 結果為3 (12命中一個,13命中兩個)
若nid=13 12 13,結果為5 (第一個13命中2個,12命中一個,第二個13命中2個)
樣本
Gremlin
運算式支援對實體的屬性進行邏輯運算、關係運算和算術運算。
filter()
及可以被by()
修飾的單步都可以使用運算式
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("thinkerpop_modern_person").filter("age<30")
==> {"label":"thinkerpop_modern_person","age":29,"name":"marko","pk":"1"}
==> {"label":"thinkerpop_modern_person","age":27,"name":"vadas","pk":"2"}