语法规则
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"}