我想做一些应该很简单的事情。我有一个数组流,其中包含两个边。对于每个数组,我只想从第一个数组的第二个边减去一个值。在某些语言中,这仅仅是array[0].value - array[1].value
。但是,我只完成了以下工作:
local(
project('a', 'b').
by(unfold().limit(1)).
by(unfold().tail(1)).
math('a - b').
by('bias'))
但是,如果没有project()
、limit()
和tail()
,这似乎要简单得多。这也让我怀疑,如果数组中有3项或更多项,我将如何从数组中获得正确的项。例如:如果第二项不再是tail()
,我将如何获得它?我猜limit(2).tail(1)
?只是看起来非常混乱。如果我简单地使用一个fold()
步骤,我可以非常接近于简化这个操作:
local(
unfold().
values('bias').
fold(0, minus))
以这种方式使用fold()
是非常干净的,但是会导致0 - a - b
的出现。如果我能用一个动态的值来代替那个种子,那么我就能取得更多的成就。但即便如此,我也必须做一些类似(2 * a) - a - b
的事情,才能达到正确的结果。将0
种子替换为动态变量(如limit(1).values('bias')
)的尝试失败,因为它是错误的类型。但无论如何我也不会满足于这种武断的代码。然后,我的最后想法是对项目进行索引,然后按索引选择:
local(
index().
with(WithOptions.indexer, WithOptions.map))
虽然边被索引得很好,但我找不到一种方法来使它有用。我想我可以用select('0')
来获取第一个项目,但是什么也没有返回。
我想我的问题是:是否有一种简单的方法来实现a - b
,就像用sum()
或fold(0, sum)
实现a + b
一样?如果没有,是否有一种更干净的方法来选择数列中的项目?还是在数学之前,所有的东西都应该放在project()
里呢?看起来太麻烦了..。
发布于 2021-02-01 18:38:42
您可以很容易地跳过project()
:
gremlin> arr = [[g.E(7).next(),g.E(8).next()],[g.E(8).next(),g.E(10).next()]]
==>[e[7][1-knows->2],e[8][1-knows->4]]
==>[e[8][1-knows->4],e[10][4-created->5]]
gremlin> g.inject(arr).unfold().as('a','b').
......1> math('a - b').
......2> by(limit(local,1).values('weight')).
......3> by(tail(local,1).values('weight'))
==>-0.5
==>0.0
您仍然必须使用unfold().limit()/tail()
,但我认为这是一种更好的方法,因为它避免创建一个Map
,只为了扔掉它。
还让我怀疑,如果数组中有3个或更多项,如何从数组中获得正确的项。例如:如果第二项不再是tail(),我将如何获得它?我猜极限(2).tail(1)?
您可以使用range()
来避免多步骤方法:
gremlin> arr = [[g.E(7).next(),g.E(8).next(),g.E(9).next()],[g.E(8).next(),g.E(10).next(),g.E(10).next()]]
==>[e[7][1-knows->2],e[8][1-knows->4],e[9][1-created->3]]
==>[e[8][1-knows->4],e[10][4-created->5],e[10][4-created->5]]
gremlin> g.inject(arr).unfold().as('a','b').
......1> math('a - b').
......2> by(limit(local,1).values('weight')).
......3> by(range(local,1,2).values('weight'))
==>-0.5
==>0.0
您可以使用sack()
来避免math()
,但我不确定它简化了对内部列表的分离(即仍然坚持limit()
/tail()
):
gremlin> arr = [[g.E(7).next(),g.E(8).next()],[g.E(8).next(),g.E(10).next()]]
==>[e[7][1-knows->2],e[8][1-knows->4]]
==>[e[8][1-knows->4],e[10][4-created->5]]
gremlin> g.withSack(0).inject(arr).unfold().
......1> sack(assign).by(limit(local,1).values('weight')).
......2> sack(minus).by(tail(local,1).values('weight')).
......3> sack()
==>-0.5
==>0.0
顺便问个好问题。
https://stackoverflow.com/questions/65989602
复制相似问题