首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >因为海王星不支持它,所以可以替代gremlin sideEffect?

因为海王星不支持它,所以可以替代gremlin sideEffect?
EN

Stack Overflow用户
提问于 2021-12-14 14:25:49
回答 1查看 109关注 0票数 0

在AWS中,我试图通过计算丹尼尔·库皮茨这里描述的余弦相似度-- https://gist.github.com/dkuppitz/79e0b009f0c9ae87db5a#file-cosim-groovy-L368 -- gremlin的sideEffect --来创建用户顶点之间的相似边,它提供了一个有用的闭包,它允许进行一些数学运算来获得相似度分数,并将这个值写入每个“相似”边缘。唉,海王星不支持sideEffect。我正在寻找一种方法,可以在不使用sideEffect的情况下在一个gremlin查询中运行下面示例中的注释部分。谢谢你的帮忙!

代码语言:javascript
复制
g.V().match(
__.as("u1").outE("rated").as("r1"),
__.as("r1").inV().as("m"),
__.as("m").inE("rated").as("r2"),
__.as("r2").outV().as("u2")
).where("u1", neq("u2")).
group().by(select("u1","u2")).
by(select("r1","r2").by("rating")).
unfold().
as("kv").
select(keys).
addE("similarity").from("u1").to("u2").as("e").
// sideEffect {
//   def r = it.get("kv").getValue()
//   def xyDotProduct = r.collect {it.r1*it.r2}.sum()
//   def xLength = Math.sqrt(r.collect {it.r1*it.r1}.sum())
//   def yLength = Math.sqrt(r.collect {it.r2*it.r2}.sum())
//   def similarity = xyDotProduct / (xLength * yLength)
//   it.get().property("similarity", similarity)
// }.iterate()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-14 14:58:38

Amazon支持sideEffect步骤,但不支持使用任何步骤的Groovy闭包。我相信,使用mathproject步骤的组合可以实现示例中显示的相同效果。这是一个与Haversine Greate圆距离的计算有点相似(在复杂性方面)的链接。也许您可以使用类似于这是来自实用格林的的方法。

代码语言:javascript
复制
start = 'SFO'
stop = 'NRT'

g.withSideEffect("rdeg", 0.017453293).
  withSideEffect("gcmiles",3956).
  V().has('code',start).as('src').
  V().has('code',stop).as('dst').
  select('src','dst').
    by(project('lat','lon').
         by('lat').
         by('lon')).
  as('grp').
  project('ladiff','lgdiff','lat1','lon1','lat2','lon2').
    by(project('la1','la2').
         by(select('grp').select('src').select('lat')).
         by(select('grp').select('dst').select('lat')).
       math('(la2 - la1) * rdeg')).
    by(project('lg1','lg2').
         by(select('grp').select('src').select('lon')).
         by(select('grp').select('dst').select('lon')).
       math('(lg2 - lg1) * rdeg')).
    by(select('grp').select('src').select('lat')).
    by(select('grp').select('src').select('lon')).
    by(select('grp').select('dst').select('lat')).
    by(select('grp').select('dst').select('lon')).
  math('(sin(ladiff/2))^2 + cos(lat1*rdeg) * cos(lat2*rdeg) * (sin(lgdiff/2))^2').
  math('gcmiles * (2 * asin(sqrt(_)))')

这种方法不使用闭包中的变量,而是使用project有效地创建仍然可以传递给math步骤的相同变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70350570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档