語法規則
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"}