has
功能:(filter)过滤,保留满足条件的实体(点、边)
备注:推荐使用
filter()
替代
g("thinkerpop").E("1;2;3;4;5;6").hasLabel("created").has("weight", P.inside(0.0, 0.6))
==> {"label":"created","pk":"1","sk":"3","weight":0.4}
==> {"label":"created","pk":"4","sk":"3","weight":0.4}
==> {"label":"created","pk":"6","sk":"3","weight":0.2}
// 等同于
g("thinkerpop").E("1;2;3;4;5;6").hasLabel("created").filter("weight<=0.6 AND weight>=0.0")
hasKey
功能:(filter)过滤字段名,保留满足条件的字段名和字段值
备注:单步支持
P
作为过滤条件
// 获取人的地址或者名字
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").properties().hasKey(P.within("location","name"))
==> {"name":"marko"}
==> {"name":"josh"}
==> {"name":"vadas"}
==> {"name":"peter"}
// 获取人的名字
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").properties().hasKey("name")
==> {"name":"marko"}
==> {"name":"josh"}
==> {"name":"vadas"}
==> {"name":"peter"}
hasLabel
功能:(filter)过滤实体(点、边)的label,保留满足条件的实体
备注:图访问时,首个查询实体的单步必须使用
hasLabel()
指定要访问的label;后续遍历中查询实体的单步若不指定label,则默认访问所有可访问的label。
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").union(outE("knows"),outE("created")).hasLabel("knows")
==> {"label":"knows","pk":"1","sk":"4","weight":1.0}
==> {"label":"knows","pk":"1","sk":"2","weight":0.5}
g("thinkerpop").V("1").hasLabel("person")
==> {"label":"person","age":29,"name":"marko","pk":"1"}
hasValue
功能:(filter)过滤字段值,保留满足条件的字段名和字段值
备注:单步支持
P
作为过滤条件
// 30岁以上的人的年龄
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").properties("age").hasValue(P.gt(30))
==> {"age":32}
==> {"age":35}
identity
功能:(map)返回输入自身
备注:单步常见于branch等类型的单步,用于表示自己
g("thinkerpop").V("1").hasLabel("person").identity()
==> {"label":"person","age":29,"name":"marko","pk":"1"}
// 人1和他/她的朋友
g("thinkerpop").V("1").hasLabel("person").union(identity(),outE("knows").inV())
==> {"label":"person","age":29,"name":"marko","pk":"1"}
==> {"label":"person","age":32,"name":"josh","pk":"4"}
==> {"label":"person","age":27,"name":"vadas","pk":"2"}
indexQuery
功能:(修饰符)倒排查询
格式:详见倒排查询
备注:
V()
只有被indexQuery()
修饰时,参数才可以为空此单步为IGraph自研扩展的单步
g("thinkerpop").V().hasLabel("software_index").indexQuery("{\"match\":{\"lang\":\"java\"}}")
==> {"label":"software_index","lang":"java","name":"ripple","pk":"5"}
inV
功能:从一条边跳转到关联的顶点
备注:
图访问方式:查询所有关联的顶点
// 默认输入边的skey为跳转字段
g("thinkerpop").E("1").hasLabel("knows").inV()
==> {"label":"person","age":32,"name":"josh","pk":"4"}
==> {"label":"person","age":27,"name":"vadas","pk":"2"}
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").outE().inV()
==> {"label":"software","lang":"java","name":"lop","pk":"3"}
==> {"label":"software","lang":"java","name":"lop","pk":"3"}
==> {"label":"software","lang":"java","name":"lop","pk":"3"}
==> {"label":"software","lang":"java","name":"ripple","pk":"5"}
==> {"label":"person","age":32,"name":"josh","pk":"4"}
==> {"label":"person","age":27,"name":"vadas","pk":"2"}
is
功能:(filter)过滤数值或者string。满足过滤条件的数值或者string被保留;否则,被丢弃。
备注:
单步支持
P
作为过滤条件。
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").values("name").is("marko")
==> "marko"
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").where(values("name").is("marko"))
==> {"label":"person","age":29,"name":"marko","pk":"1"}
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").where(outE("knows").count().is(2))
==> {"label":"person","age":29,"name":"marko","pk":"1"}
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").where(values("age").is(P.inside(28,34)))
==> {"label":"person","age":29,"name":"marko","pk":"1"}
==> {"label":"person","age":32,"name":"josh","pk":"4"}
label
功能:(map)返回实体(点/边)的图label
备注:
图访问中,返回实体图中对应的label
g("thinkerpop").V("1").hasLabel("person").label()
==> "person"
g("thinkerpop").V("1").hasLabel("person").outE().label()
==> "created"
==> "knows"
==> "knows"
limit
功能:(filter)截断,保留前
NUM
个结果格式:
limit(NUM)
,NUM
为uint32类型,建议NUM<50000
备注
limit(NUM)
等同于range(0,NUM)
tail()
用于保留最后NUM
个结果单步会隐式地插入
barrier()
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").limit(2)
==> {"label":"person","age":29,"name":"marko","pk":"1"}
==> {"label":"person","age":32,"name":"josh","pk":"4"}
local
功能:(branch)对每个输入object单独执行子遍历
备注:
单步串行地计算每个object的子遍历,故性能较差。
单步可用于保证结果的多样性,但推荐使用
distinct()
替代这种场景。
// 不使用local,所有对象的跳转结果保留1个
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").outE("created").limit(1)
==> {"label":"created","pk":"1","sk":"3","weight":0.4}
// 使用local,每个对象的跳转结果保留1个,保证结果的多样性
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").local(outE("created").limit(1))
==> {"label":"created","pk":"1","sk":"3","weight":0.4}
==> {"label":"created","pk":"4","sk":"3","weight":0.4}
==> {"label":"created","pk":"6","sk":"3","weight":0.2}
等同于
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").outE("created").distinct().by("pk")
loops
功能:(map)返回当前循环的次数
// 执行out()循环,直到遇到marko或者循环了2次
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").emit(or(__.has("name","marko"),loops().is(P.eq(2)))).repeat(__.out()).values("name")
==> "marko"
==> "lop"
==> "ripple"
math
功能:(map)科学计算
运算符:
(*)标注的是iGraph扩展的函数
名称
含义
例子
+,-,*,/,%,^
加,减,乘,除,取余,次方
math("_+_")/math("_^2")
abs
求绝对值
math("abs(_)")
cos,sin,tan,(*)cot,(*)sec,(*)csc,acos,asin,atan
三角函数
math("cos(_)")
(*)atan2
返回以弧度表示的 y/x 的反正切
math("atan2(x,y)")
consh,sinh,tanh,
(*)acosh,(*)asinh,(*)atanh
双曲函数
math("cosh(_)")
(*)sinc
辛格/抽样函数(sinx/x)
math("sinc(_)")
(*)deg2grad,(*)grad2deg,(*)rad2deg,(*)deg2rad
弧度(rad)<=>角度(deg)<=>梯度(grad)转换
math("cos(deg2rad(_))")
log,log10,log2,(*)log1p,
对数运算
math("log2(_)")
(*)logn
对数运算
math("logn(_,2)")
exp,(*)expm1
指数运算
math("exp(_)")
(*)pow
指数运算
math("pow(_,2)")
ceil
向上取整
math("ceil(_)")
floor
向下取整
math("floor(_)")
(*)round
四舍五入到整数
math("round(_)")
(*)roundn
四舍五入到n位小数
math("roundn(_,2)")
sqrt
求平方根
math("sqrt(_)")
cbrt
求立方根
math("cbrt(_)")
(*)root
求n次方根(n是正整数)
math("root(x,5)")
signum,(*)sgn
符号函数
math("signum(_)")
(*)avg,(*)max,(*)min,
求平均值、最大/小值
math("a,b,c,d")
(*)sum,(*)mul
求和、乘积
math("mul(a,b,c)")
(*)clamp,(*)iclamp
区间限定函数
math("clamp(-1,a,1)")
(*)inrange
返回是否处于区间内
math("inrange(-1,_,1)")
(*)<,(*)<=,(*)=,(*)==,(*)!=,(*)<>,(*)>,(*)>=,(*)equal,(*)not_equal
逻辑判断运算符
math("equal(_,2)") /
math("_==2")
(*)erf,(*)erfc
误差函数
math("erf(_)")
(*)frac
返回实数的小数部分
math("frac(_)")
(*)trunc
返回实数的整数部分
math("trunc(_)")
(*)hypot
返回直角三角形的斜边值
math("hypot(a,b)")
(*)ncdf
正态累积分布函数
math("ncdf(_)")
(*)and,(*)nand,(*)or,(*)nor,(*)not,(*)xor,(*)xnor,(*)&,
(*)|
逻辑运算符
math("a and b or c") /
math("a & b | c")
(*)mand,(*)mor
批量and/or
math("mand("a>1,b<2,c=3")")
(*)true,(*)false
返回0或1
math("true & _=2")
备注:
"_"表示输入本身
操作对象:
_
和其他sideEffect的key(_
是指输入本身)如果参与计算的元素是多值类型,math算子会按向量处理,以下函数和运算符不支持多值:mand,mor,&,|,atan2,logn,clamp,iclamp,root,hypot,inrange,roundn
以下函数在处理向量时进行聚合操作:avg,min,max,sum,mul
// 人1的年龄平方数
g("thinkerpop").V("1").hasLabel("person").values("age").math("_ * _")
==> 841
// 人1和自己每个朋友的年龄和
g("thinkerpop").V("1").hasLabel("person").values("age").aggregate("x").cap("x").E("1").hasLabel("knows").inV().values("age").as("y").local(select("x").unfold().math("_ + y"))
==> 61
==> 56
max
功能:(map)计算输入objects的最大值。
备注:
单步仅支持数字类型(非
bool
类型)的输入max(Scope.local)
支持迭代器类型的输入,并且容器内的元素必须是数字类型(非bool
类型)单步会隐式地插入
barrier()
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").values("age").max()
==> 35
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").values("age").fold().max(Scope.local)
==> 35
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").aggregate("x").by("age").cap("x").max(Scope.local)
==> 35
mean
功能:(map)计算输入objects的平均值。
备注:
单步仅支持数字类型(非
bool
类型)的输入单步会隐式地插入
barrier()
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").values("age").mean()
==> 30.75
min
功能:(map)计算输入objects的最小值。
备注:
单步仅支持数字类型(非
bool
类型)的输入min(Scope.local)
支持迭代器类型的输入,并且容器内的元素必须是数字类型(非bool
类型)单步会隐式地插入
barrier()
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").values("age").min()
==> 27
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").values("age").fold().min(Scope.local)
==> 27
g("thinkerpop").V("1;2;3;4;5;6").hasLabel("person").aggregate("x").by("age").cap("x").min(Scope.local)
==> 27
not
功能:(filter)返回“子遍历不能产生结果”的输入
// 可怜到没朋友的人
g("thinkerpop").V("1;2;4;6").hasLabel("person").not(outE("knows"))
==> {"label":"person","age":32,"name":"josh","pk":"4"}
==> {"label":"person","age":27,"name":"vadas","pk":"2"}
==> {"label":"person","age":35,"name":"peter","pk":"6"}
// 不是27岁的人
g("thinkerpop").V("1;2;4;6").hasLabel("person").not(values("age").is(27))
==> {"label":"person","age":29,"name":"marko","pk":"1"}
==> {"label":"person","age":32,"name":"josh","pk":"4"}
==> {"label":"person","age":35,"name":"peter","pk":"6"}