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