表达式
文法规则
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