全部產品
Search
文件中心

Graph Compute:Steps H-N

更新時間:Jun 30, 2024

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

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