Steps H-N

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