gremlin - 在已过滤、切片和切块后从 gremlin 路径返回特定属性
问题描述
给定以下数据集:
g = TinkerGraph.open().traversal()
g.addV('UserJourney').property(id, 'Jeremy/Morn').
addV('UserJourney').property(id, 'Jeremy/Eve').
addV('UserJourney').property(id, 'Doug/Morn').
addV('JourneyStep').property(id, 'Watches').
addV('JourneyStep').property(id, 'TV').
addV('JourneyStep').property(id, 'Eats').
addV('JourneyStep').property(id, 'Eggs').
addV('JourneyStep').property(id, 'Toast').
addV('JourneyEnd').property(id, 'JourneyEnd').
addE('Jeremy/Morn').from(V('Eats')).to(V('Eggs')).
property('duration', 40).
addE('Jeremy/Morn').from(V('Eggs')).to(V('JourneyEnd')).
property('duration', 35).
addE('firstStep').from(V('Jeremy/Morn')).to(V('Eats')).
property('duration', 30).
addE('Jeremy/Eve').from(V('Eats')).to(V('Toast')).
property('duration', 25).
addE('Jeremy/Eve').from(V('Toast')).to(V('JourneyEnd')).
property('duration', 20).
addE('firstStep').from(V('Jeremy/Eve')).to(V('Eats')).
property('duration', 15).
addE('Doug/Morn').from(V('Watches')).to(V('TV')).
addE('Doug/Morn').from(V('TV')).to(V('Eats')).
addE('Doug/Morn').from(V('Eats')).to(V('Toast')).
addE('Doug/Morn').from(V('Toast')).to(V('JourneyEnd')).
addE('firstStep').from(V('Doug/Morn')).to(V('Watches')).
iterate()
我想返回每次旅行的路径(Jeremy/Morn、Jeremy/Eve、Doug/Morn)以及每条路径的持续时间。除了每条路径的总持续时间(成本)之外,我还想知道路径上每个步骤的持续时间(成本)。然后我想按总重量订购旅程,并返回前 10 名。
到目前为止,我的代码如下:
g.V().hasLabel('UserJourney').as('a').out('firstStep').as('b').
repeat('r1', outE().where(eq('a')).by(label).by(id).inV()).
until(loops('r1').is(50).or().hasLabel('JourneyEnd').or().cyclicPath()).
path().
from('b').as('p').
map(unfold().coalesce(values('duration'),
constant(0.0)).sum()).as('cost').
select('cost','p').
group().by(project('k').by(select('a'))).unfold().select(values).tail(local).
order().by('cost', desc).
limit(10)
==>[cost:75.0,p:[v[Eats],e[0][Eats-Jeremy/Morn->Eggs],v[Eggs],e[1][Eggs-Jeremy/Morn->JourneyEnd],v[JourneyEnd]]]
==>[cost:45.0,p:[v[Eats],e[3][Eats-Jeremy/Eve->Toast],v[Toast],e[4][Toast-Jeremy/Eve->JourneyEnd],v[JourneyEnd]]]
==>[cost:0.0,p:[v[Watches],e[6][Watches-Doug/Morn->TV],v[TV],e[7][TV-Doug/Morn->Eats],v[Eats],e[8][Eats-Doug/Morn->Toast],v[Toast],e[9][Toast-Doug/Morn->JourneyEnd],v[JourneyEnd]]]
这可行,但在 javascript 的结果集中,我只得到边和顶点的 id 和标签。我需要标签、ID 和至少持续时间。
提前感谢您的任何帮助
解决方案
将path
步骤更改为具有一些by
调制器允许距离在路径中,然后稍后从中选择。
gremlin> g.V().
......1> hasLabel('UserJourney').as('a').
......2> out('firstStep').as('b').
......3> repeat('r1', outE().where(eq('a')).by(label).by(id).inV()).
......4> until(
......5> loops('r1').is(50).or().hasLabel('JourneyEnd').or().cyclicPath()).
......6> path().from('b').as('p').
......7> by().
......8> by(valueMap(true,'duration')).
......9> map(unfold().coalesce(select('duration'), constant(0.0)).sum()).
.....10> as('cost').
.....11> select('cost', 'p').
.....12> group().by(project('k').by(select('a'))).
.....13> unfold().
.....14> select(values).
.....15> tail(local).
.....16> order().by('cost', desc).
.....17> limit(10)
==>[cost:75.0,p:[v[Eats],[id:0,label:Jeremy/Morn,duration:40],v[Eggs],[id:1,label:Je
remy/Morn,duration:35],v[JourneyEnd]]]
==>[cost:45.0,p:[v[Eats],[id:3,label:Jeremy/Eve,duration:25],v[Toast],[id:4,label:Je
remy/Eve,duration:20],v[JourneyEnd]]]
==>[cost:0.0,p:[v[Watches],[id:6,label:Doug/Morn],v[TV],[id:7,label:Doug/Morn],v[Eat
s],[id:8,label:Doug/Morn],v[Toast],[id:9,label:Doug/Morn],v[JourneyEnd]]]
推荐阅读
- python - 为什么在 shell 和模板中访问 page_range 不同?
- symfony - Symfony api-platform:用户应该检索他自己的实体
- java - How to fit the clickable area on a button
- json - how to count the frequency of occurrence of some specific words of my data in hive?
- javascript - How to handle/chain synchronous side effects that depend on another with React hooks
- php - 有没有办法在模式中插入 $name
- sql - Joins on multiple tables in Postgresql
- javascript - 如何在javascript中调试视频暂停
- python - 如何使用openCV从文件夹中有效地加载许多图像
- python - 在 Python 中使用 OpenCV 编写 HDR 图像的正确方法是什么?