表达式

语法规则

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