gremlin - Gremlin 查询以获取 k 距离顶点和连接它们的边
问题描述
我想从给定的顶点开始,让所有连接的顶点和边达到 ak 距离。输出应该包括连接所包含顶点的所有边(即使该边在 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').store('v').
repeat(bothE().where(without('e')).
choose(loops().is(lt(2)),
aggregate('e'),
filter(otherV().where(within('v'))).aggregate('e').not(identity())).
otherV().where(without('v')).aggregate('v')).
cap('e','v')
在您的示例图上:
gremlin> g.V().has('person','name','c').store('v').
......1> repeat(bothE().where(without('e')).
......2> choose(loops().is(lt(2)),
......3> aggregate('e'),
......4> filter(otherV().where(within('v'))).aggregate('e').
......5> not(identity())).
......6> otherV().where(without('v')).aggregate('v')).
......7> cap('e','v').sideEffect {
......8> m = it.get()
......9> println 'Vertices:'
.....10> m.get('v').each {
.....11> println "* " + it.value('name')
.....12> }
.....13> println 'Edges:'
.....14> m.get('e').each {
.....15> println "* " + [it.outVertex(), it.inVertex()]*.value('name').join(' -> ')
.....16> }
.....17> }.iterate()
Vertices:
* c
* d
* b
* e
* a
Edges:
* c -> d
* b -> c
* d -> e
* a -> b
* e -> a
推荐阅读
- python - Python - 如果数字大于 0,则运行平均值
- redirect - 使用 Scrapy Spider 中间件进行重定向(Deferred 中未处理的错误)
- ormlite - How to specify VARCHAR column length in custom data persister?
- jquery - Bootstrap DatePicker 中的 Jquery 版本问题
- loops - 从累积收益计算每日收益
- python - Wxpython:如何为搜索框使用不同的边框颜色
- javascript - 在 Node.js 中找不到子目录中的文件
- pandas - 使用熊猫中其他列的值名称创建新列
- rx-java2 - Vert.x Kafka 不遵守 RxJava 线程分配?
- boost - 用于计算 boost::hash 的公式