微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过janusgraph中的自定义函数计算边缘的权重?

如何解决如何通过janusgraph中的自定义函数计算边缘的权重?

所以我们在Janusgraph中下图:

g.addV().property('nameV','source').as('1').
  addV().property('nameV','destiny2').as('2').
  addV().property('nameV','destiny4').as('3').
  addE('connects').from('1').to('2').property('nameE','edge1').property('bw',2000).property('latency',100).
  addE('connects').from('2').to('3').property('nameE','edge2').property('bw',100).property('latency',200).
  addE('connects').from('1').to('3').property('nameE','edge3').property('bw',3000).property('latency',500).iterate();

,此查询使用带宽(bw)作为路径上每个边缘的权重,为我提供了两个节点之间的最短路径:

g.V().has('nameV','source').repeat(outE().inV().simplePath()).until(has('nameV','destiny4')).
  path().as('p').  
  by(coalesce(values('bw'),constant(0.0))).
  map(unfold().sum()).as('xyz').
  select('p','xyz').
  order().by('xyz',asc).limit(1).
  next();  

我需要的是一种使用自定义函数计算边缘(在查询时)的权重的方法,该函数使用边缘的参数,例如:100 * bw / latency

非常感谢您的帮助!

解决方法

您可以结合使用sackmath步骤来在Gremlin中完成所有操作

gremlin> g.withSack(0).
......1>   V().has('nameV','source').
......2>   repeat(outE().
......3>          sack(sum).
......4>            by(project('bw','lat').
......5>              by('bw').
......6>              by('latency').
......7>              math('100*bw/lat')).
......8>          inV().
......9>          simplePath()).
.....10>   until(has('nameV','destiny4')).
.....11>   order().
.....12>     by(sack(),desc).
.....13>   path()

==>[v[0],e[6][0-connects->2],v[2],e[7][2-connects->4],v[4]]
==>[v[0],e[8][0-connects->4],v[4]]  

已更新(已扩展):

要更改结果以包括计算出的值以及bw的各个值,可以将pathsack合并到union中步。使用local步骤是为了将fold分别应用于每个路径,而不是所有路径。

gremlin> g.withSack(0).
......1>   V().has('nameV',desc).
.....13>   local(
.....14>     union(
.....15>       path().
.....16>         by('nameV').
.....17>         by(valueMap('bw','latency')),.....18>       sack()).
.....19>       fold())  

==>[[source,[bw:2000,latency:100],destiny2,[bw:100,latency:200],destiny4],2050.0]
==>[[source,[bw:3000,latency:500],600.0]    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。