表达式

文法规则

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.V("1;2;3;4;5;6").by("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"}

g.V("1;2;3;4;5;6").by("thinkerpop_modern_person").alias("name:nick;age*2:double_age")
==> {"label":"thinkerpop_modern_person","age":29,"double_age":58,"nick":"marko","pk":"1"}
==> {"label":"thinkerpop_modern_person","age":32,"double_age":64,"nick":"josh","pk":"4"}
==> {"label":"thinkerpop_modern_person","age":27,"double_age":54,"nick":"vadas","pk":"2"}
==> {"label":"thinkerpop_modern_person","age":35,"double_age":70,"nick":"peter","pk":"6"}

g.withSack(supplier(normal,"1.0"),Splitter.identity,Operator.sum).E("1;2;3;4;5;6").by("thinkerpop_modern_created").sack(Operator.assign).by("weight*__SACK__").sack()
==> {"data":[{"label":"thinkerpop_modern_created","pk":"1","sk":"3","weight":0.4},0.4
==> {"label":"thinkerpop_modern_created","pk":"4","sk":"3","weight":0.4},0.4
==> {"label":"thinkerpop_modern_created","pk":"4","sk":"5","weight":1.0},1.0
==> {"label":"thinkerpop_modern_created","pk":"6","sk":"3","weight":0.2},0.2

PG

  • 表达式可以作为alias子句和filter子句的参数,参与逻辑运算、关系运算和算术运算
alias=sqrt(auction)*20+cos(300):field_alias

filter=f1!=f2 AND f1>10
阿里云首页 智能推荐 AIRec 相关技术圈