在AWS中,我试图通过计算丹尼尔·库皮茨这里描述的余弦相似度-- https://gist.github.com/dkuppitz/79e0b009f0c9ae87db5a#file-cosim-groovy-L368 -- gremlin的sideEffect --来创建用户顶点之间的相似边,它提供了一个有用的闭包,它允许进行一些数学运算来获得相似度分数,并将这个值写入每个“相似”边缘。唉,海王星不支持sideEffect。我正在寻找一种方法,可以在不使用sideEffect的情况下在一个gremlin查询中运行下面示例中的注释部分。谢谢你的帮忙!
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()发布于 2021-12-14 14:58:38
Amazon支持sideEffect步骤,但不支持使用任何步骤的Groovy闭包。我相信,使用math和project步骤的组合可以实现示例中显示的相同效果。这是一个与Haversine Greate圆距离的计算有点相似(在复杂性方面)的链接。也许您可以使用类似于这是来自实用格林的的方法。
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步骤的相同变量。
https://stackoverflow.com/questions/70350570
复制相似问题