在 Gremlin 中实现行号的最简单方法

Simplest way to implement a Row Number in Gremlin

我需要为图表中的所有顶点分配一个唯一的递增值。在 SQL 中,我会使用 ROW_NUMBER。 Gremlin 有简单的方法吗?我希望是这样的:

g.V().<some_step>()

输出:

1
2
3
...

Gremlin 中没有这样的步骤,我不知道有任何图形数据库本身具有这种功能。也许 gsql 也许是因为它由关系数据库支持?我认为您需要在图形外部管理数字并使用某种形式的锁定机制自行跟踪它。

我认为我不会在大图上尝试此操作,但对于中等大小的图,您可以尝试使用 index 步骤。下面是一个使用 air-routes 数据集的例子。

index 将递增索引值添加到列表。

gremlin> g.V().limit(5).fold().index().unfold()
==>[v[0],0]
==>[v[1],1]
==>[v[2],2]
==>[v[3],3]
==>[v[4],4]

使用 local 作用域,您可以访问该列表的成员。

gremlin> g.V().limit(5).fold().index().unfold().limit(local,1)
==>v[0]
==>v[1]
==>v[2]
==>v[3]
==>v[4]

使用这些技术,我们可以使用索引值向每个机场添加新的 属性。我只做了这个例子中的前 5 个。

gremlin> g.V().limit(5).
               fold().index().unfold().as('list').
               limit(local,1).
               property('index',select('list').tail(local))

==>v[0]
==>v[1]
==>v[2]
==>v[3]
==>v[4]

并检查结果。

gremlin> g.V(1).valueMap()
==>[country:[US],code:[ATL],longest:[12390],city:[Atlanta],index:[1],lon:[-84.4281005859375],type:[airport],elev:[1026
],icao:[KATL],region:[US-GA],runways:[5],lat:[33.6366996765137],desc:[Hartsfield - Jackson Atlanta International Airpo
rt]]


gremlin> g.V(2).valueMap()
==>[country:[US],code:[ANC],longest:[12400],city:[Anchorage],index:[2],lon:[-149.996002197266],type:[airport],elev:[15
1],icao:[PANC],region:[US-AK],runways:[3],lat:[61.1744003295898],desc:[Anchorage Ted Stevens]]