全部產品
Search
文件中心

:運算式

更新時間:Jun 30, 2024

文法規則

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"}