首页 > 解决方案 > 在已过滤、切片和切块后从 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 和至少持续时间。

提前感谢您的任何帮助

标签: gremlin

解决方案


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]]] 

推荐阅读