给出如下图:
g.V().drop()
g.addV('Person').property(id, 'P1').property('age', 20)
g.addV('Person').property(id, 'P2').property('age', 70)
g.addV('Person').property(id, 'P3').property('age', 32)
g.addV('Person').property(id, 'P4').property('age', 50)
g.addV('Person').property(id, 'P5').property('age', 63)
g.addE('KNOWS').from(V('P1')).to(V('P2'))
g.addE('KNOWS').from(V('P2')).to(V('P3'))
g.addE('KNOWS').from(V('P3')).to(V('P4'))
g.addE('KNOWS').from(V('P4')).to(V('P5'))
g.addE('KNOWS').from(V('P2')).to(V('P5'))
g.addE('KNOWS').from(V('P3')).to(V('P5'))
我想知道P1
边引起的P5
和KNOWS
之间的所有路径,然后计算该路径上年龄差距的乘积。
现在,我只能得到路径:
gremlin> g.V('P1').
......1> repeat(both('KNOWS').simplePath()).
......2> until(hasId('P5')).path()
==>[v[P1],v[P2],v[P5]]
==>[v[P1],v[P2],v[P3],v[P5]]
==>[v[P1],v[P2],v[P3],v[P4],v[P5]]
gremlin> g.V('P1').
......1> repeat(both('KNOWS').simplePath()).
......2> until(hasId('P5')).path().by("age")
==>[20,70,63]
==>[20,70,32,63]
==>[20,70,32,50,63]
要弄清楚product of age gap
的含义,请以第一个路径[20,70,63]
为例:年龄差距为[70-20, 63-70]
,即[50, -7]
,年龄差距必须为正,因此乘积为50 * 7 = 350
。
预期输出为:
==>[path: [v[P1],v[P2],v[P5]], product: 350]
==>[path: [v[P1],v[P2],v[P3],v[P5]], product: 58900]
==>[path: [v[P1],v[P2],v[P3],v[P4],v[P5]], product: 444600]
感谢您的帮助。
答案 0 :(得分:1)
为一些严肃的格林姆林高尔夫做准备。
g.V('P1').
repeat(both('KNOWS').simplePath()).
until(hasId('P5')).
project('path','product').
by(path()).
by(path().
by('age').
repeat(filter(count(local).is(gt(1))). /* for each pair of ages ... */
sack(assign).
by(limit(local, 1)).
skip(local, 1).
sack(minus). /* ... calculate the difference */
by(limit(local, 1))).
emit().
sack().fold(). /* fold gaps into a list and ... */
sack(assign).
by(limit(local, 1)).
skip(local, 1).
until(__.not(unfold())).
repeat(sack(mult). /* ... calculate the product */
by(limit(local, 1)).
skip(local, 1)).
choose(sack().is(lt(0)), /* make sure gaps are positive */
sack(mult).by(constant(-1))).
sack())
看起来很复杂,但是主要发生了两个简单的事情。获取年龄列表(path().by('age')
)后,第一个repeat()
收集年龄之间的差距。差距被折叠到一个新列表中,并传递到第二个repeat()
,然后计算出乘积。
在示例图中:
gremlin> g.V('P1').
......1> repeat(both('KNOWS').simplePath()).
......2> until(hasId('P5')).
......3> project('path','product').
......4> by(path()).
......5> by(path().
......6> by('age').
......7> repeat(filter(count(local).is(gt(1))).
......8> sack(assign).
......9> by(limit(local, 1)).
.....10> skip(local, 1).
.....11> sack(minus).
.....12> by(limit(local, 1))).
.....13> emit().
.....14> sack().fold().
.....15> sack(assign).
.....16> by(limit(local, 1)).
.....17> skip(local, 1).
.....18> until(__.not(unfold())).
.....19> repeat(sack(mult).
.....20> by(limit(local, 1)).
.....21> skip(local, 1)).
.....22> choose(sack().is(lt(0)),
.....23> sack(mult).by(constant(-1))).
.....24> sack())
==>[path:[v[P1],v[P2],v[P5]],product:350]
==>[path:[v[P1],v[P2],v[P3],v[P5]],product:58900]
==>[path:[v[P1],v[P2],v[P3],v[P4],v[P5]],product:444600]