Gremlin 按 属性 升序排列边,并根据边在有序边列表中的位置在边上标记 属性
Gremlin order edges by property in ascending and mark a property on the edge according to the position of the edge in the ordered list of edges
我有一个“用户”顶点,其中的用户很少。我有一个“邀请”顶点,它基本上讲述了一个用户发送给另一个用户的邀请。我有一个“sentTo”边连接邀请顶点和用户顶点(邀请的接收者用户)。我有一条“sentBy”边,将邀请顶点连接到用户顶点(发送邀请的用户)。 sentBy 边缘有一个“on”属性,它是一个 Date 对象。 sentBy 边缘也有“inviterCount”属性,它基本上是该接收者用户(收到邀请的用户)的邀请计数(在创建 sentBy 边缘时)。出于某种原因,我正确设置了“on”属性,但没有设置 inviterCount。为了在 sentBy 边上设置 inviterCount,我需要首先对发送给该用户的邀请进行排序。我能够按“on”日期按升序对 sentBy 边进行排序,这是一个相当简单的 gremlin 查询。我正在努力更新 inviterCount 属性,这基本上是该用户在邀请列表中的位置。对于给定的邀请接收者,我如何知道边列表中边的位置,并在查询中的该边 (inviterCount) 上设置 属性?
g.addV('User').property('userId',1).property('name','Sam').as('u1')
.addV('User').property('userId',2).property('name','Ram').as('u2')
.addV('User').property('userId',3).property('name','Cam').as('u3')
.addV('User').property('userId',4).property('name','Nam').as('u4')
.addV('Invitation').property('invitationId',1).as('i1')
.addE('sentBy').property('on',new Date(1621047481204)).to('u1')
.select('i1').addE('sentTo').to('u4')
.addV('Invitation').property('invitationId',2).as('i2')
.addE('sentBy').property('on',new Date(1621047612262)).to('u2')
.select('i2').addE('sentTo').to('u4')
.addV('Invitation').property('invitationId',3).as('i3')
.addE('sentBy').property('on',new Date(1621047644430)).to('u3')
.select('i3').addE('sentTo').to('u4')
g.V().hasLabel('User').has('name','Nam').inE('sentTo').outV(). outE('sentBy').order().by('on')
正如我之前所说,sentBy 边缘有另一个 属性 需要设置的 inviterCount。
编辑 我已经通读了 sacks,但它们对我需要做的事情没有帮助。对于每次遍历,都会重置 sack 变量,并且在该遍历中将执行对该 sack 的任何操作。我需要的是一个进行遍历的计数器。简单来说,我需要一个迭代计数器。我在基本的 for 循环中需要一个 'i'。
index
步骤可以用来模拟你的i是索引需求如下。如果您需要对这些值做一些事情,那么您可以使用 tail
步骤来获取每条边的索引。
gremlin> g.V().hasLabel('User').
......1> has('name','Nam').
......2> inE('sentTo').
......3> outV().
......4> outE('sentBy').
......5> order().
......6> by('on').
......7> fold().
......8> index().
......9> unfold()
==>[e[60896][60894-sentBy->60882],0]
==>[e[60900][60898-sentBy->60885],1]
==>[e[60904][60902-sentBy->60888],2]
可以扩展查询以在使用索引的边上创建属性。
gremlin> g.V().hasLabel('User').
......1> has('name','Nam').
......2> inE('sentTo').
......3> outV().
......4> outE('sentBy').
......5> order().
......6> by('on').
......7> fold().
......8> index().
......9> unfold().as('edges').
.....10> limit(local,1).
.....11> property('i',select('edges').tail(local,1))
==>e[60944][60942-sentBy->60930]
==>e[60948][60946-sentBy->60933]
==>e[60952][60950-sentBy->60936]
gremlin> g.E(60944,60948,60952).valueMap()
==>[i:0,on:Fri May 14 21:58:01 CDT 2021]
==>[i:1,on:Fri May 14 22:00:12 CDT 2021]
==>[i:2,on:Fri May 14 22:00:44 CDT 2021]
我有一个“用户”顶点,其中的用户很少。我有一个“邀请”顶点,它基本上讲述了一个用户发送给另一个用户的邀请。我有一个“sentTo”边连接邀请顶点和用户顶点(邀请的接收者用户)。我有一条“sentBy”边,将邀请顶点连接到用户顶点(发送邀请的用户)。 sentBy 边缘有一个“on”属性,它是一个 Date 对象。 sentBy 边缘也有“inviterCount”属性,它基本上是该接收者用户(收到邀请的用户)的邀请计数(在创建 sentBy 边缘时)。出于某种原因,我正确设置了“on”属性,但没有设置 inviterCount。为了在 sentBy 边上设置 inviterCount,我需要首先对发送给该用户的邀请进行排序。我能够按“on”日期按升序对 sentBy 边进行排序,这是一个相当简单的 gremlin 查询。我正在努力更新 inviterCount 属性,这基本上是该用户在邀请列表中的位置。对于给定的邀请接收者,我如何知道边列表中边的位置,并在查询中的该边 (inviterCount) 上设置 属性?
g.addV('User').property('userId',1).property('name','Sam').as('u1')
.addV('User').property('userId',2).property('name','Ram').as('u2')
.addV('User').property('userId',3).property('name','Cam').as('u3')
.addV('User').property('userId',4).property('name','Nam').as('u4')
.addV('Invitation').property('invitationId',1).as('i1')
.addE('sentBy').property('on',new Date(1621047481204)).to('u1')
.select('i1').addE('sentTo').to('u4')
.addV('Invitation').property('invitationId',2).as('i2')
.addE('sentBy').property('on',new Date(1621047612262)).to('u2')
.select('i2').addE('sentTo').to('u4')
.addV('Invitation').property('invitationId',3).as('i3')
.addE('sentBy').property('on',new Date(1621047644430)).to('u3')
.select('i3').addE('sentTo').to('u4')
g.V().hasLabel('User').has('name','Nam').inE('sentTo').outV(). outE('sentBy').order().by('on')
正如我之前所说,sentBy 边缘有另一个 属性 需要设置的 inviterCount。
编辑 我已经通读了 sacks,但它们对我需要做的事情没有帮助。对于每次遍历,都会重置 sack 变量,并且在该遍历中将执行对该 sack 的任何操作。我需要的是一个进行遍历的计数器。简单来说,我需要一个迭代计数器。我在基本的 for 循环中需要一个 'i'。
index
步骤可以用来模拟你的i是索引需求如下。如果您需要对这些值做一些事情,那么您可以使用 tail
步骤来获取每条边的索引。
gremlin> g.V().hasLabel('User').
......1> has('name','Nam').
......2> inE('sentTo').
......3> outV().
......4> outE('sentBy').
......5> order().
......6> by('on').
......7> fold().
......8> index().
......9> unfold()
==>[e[60896][60894-sentBy->60882],0]
==>[e[60900][60898-sentBy->60885],1]
==>[e[60904][60902-sentBy->60888],2]
可以扩展查询以在使用索引的边上创建属性。
gremlin> g.V().hasLabel('User').
......1> has('name','Nam').
......2> inE('sentTo').
......3> outV().
......4> outE('sentBy').
......5> order().
......6> by('on').
......7> fold().
......8> index().
......9> unfold().as('edges').
.....10> limit(local,1).
.....11> property('i',select('edges').tail(local,1))
==>e[60944][60942-sentBy->60930]
==>e[60948][60946-sentBy->60933]
==>e[60952][60950-sentBy->60936]
gremlin> g.E(60944,60948,60952).valueMap()
==>[i:0,on:Fri May 14 21:58:01 CDT 2021]
==>[i:1,on:Fri May 14 22:00:12 CDT 2021]
==>[i:2,on:Fri May 14 22:00:44 CDT 2021]