【发布时间】:2019-06-26 12:20:18
【问题描述】:
我想从一个给定的顶点开始,得到所有连接的顶点和边,直到 k 距离。 输出应该包括连接所包含顶点的所有边(即使该边在 k+1 距离处),这样我们就有了一个完整的子图。
想象一下我们有这个:
g.addV('person').property('name', 'a').as('va')
.addV('person').property('name', 'b').as('vb')
.addV('person').property('name', 'c').as('vc')
.addV('person').property('name', 'd').as('vd')
.addV('person').property('name', 'e').as('ve')
.addV('person').property('name', 'f').as('vf')
.addV('person').property('name', 'g').as('vg')
.select('va').addE('knows').to('vb')
.select('vb').addE('knows').to('vc')
.select('vc').addE('knows').to('vd')
.select('vd').addE('knows').to('ve')
.select('ve').addE('knows').to('va')
.select('ve').addE('knows').to('vf')
.select('vf').addE('knows').to('vg')
a->b->c->d->e->(a) 和 e->f->g
如果我们从距离为 2 的 c 开始,我们应该有
a->b->c->d->e->(a)
有了这个查询
g.V().has('person','name','c')
.repeat(bothE().dedup()
.store("e")
.bothV()
.dedup()
.store("v"))
.times(2)
.cap('e','v')
我可以得到a->b->c->d->e,但我们失去了e->a 优势
有了这个查询
g.V().has('person','name','c')
.repeat(bothE().dedup()
.store("e")
.bothV()
.dedup()
.store("v"))
.times(2)
.bothE()
.dedup()
.store('e')
.cap('e','v')
我们得到了连接外部顶点的额外边,但我们也得到了连接外部顶点的边f
我们得到a->b->c->d->e->(a),但也得到e->f
我们怎样才能只得到k个距离的顶点和连接它们的边?
【问题讨论】:
-
这似乎工作,虽然有一些重复的边缘: g.V().has('person','name','c').sideEffect(repeat(bothE().dedup().aggregate ('e').bothV().dedup().aggregate('v')).times(2).bothE().dedup().where(__.inV().where(within('v' ))).where(__.outV().where(within('v'))).aggregate('e')).cap('v','e')
标签: gremlin tinkerpop tinkerpop3