按顶点属性和边属性(如果存在)排序

时间:2019-01-01 19:47:38

标签: gremlin tinkerpop tinkerpop3 amazon-neptune

考虑一个社交媒体网站,其中user(顶点)可以share(边缘)另一个post的{​​{1}}(顶点)。

构造用户供稿时,它看起来像这样:

user

到目前为止很好,但是我需要使用以下逻辑对这些帖子进行排序:

  • 如果帖子中有来自用户I const myUserId = 123; g.V(myUserId) .as("myUser") .union( // posts of users the requesting user follows __.out("follow").out("post"), // posts shared by users the requesting user follows __.out("follow").out("share"), // posts of the requesting user __.out("post") ) 的传入share边,请按该follow边的createdDate属性进行排序(按帖子是共享的,而不是帖子的创建日期。)

  • 否则,请按share的{​​{1}}属性进行排序。

类似的东西:

createdDate

问题在于,并非所有帖子都具有post边缘,因此会引发错误。

  

错误:GraphQL错误:错误:错误:服务器错误:   {“ requestId”:“ 53e7e66c-302e-4521-ac39-b672b4cb52e6”,“代码”:“ InvalidParameterException”,“ detailedMessage”:“ The   提供的遍历程序未映射到值:   v [c9b66e21-f8fc-48e5-bdcd-c580248b3f52]-> [VertexStep(IN,[share],edge)@ [shareEdge],   EdgeVertexStep(OUT),VertexStep(IN,[follow],vertex),   NeptuneHasStep([〜id.eq(f70a5a2d-f606-44b8-8fa6-1e359033223e)]),   SelectOneStep(last,shareEdge),NoOpBarrierStep(2500),   PropertiesStep([createdDate],property)]“}(499)

仅当边缘存在时,如何才能按边缘属性排序,而在边缘属性不存在的情况下又退回到顶点属性排序?

1 个答案:

答案 0 :(得分:2)

我认为您可以使用coalesce()解决此问题。这是一个小的示例图(在询问有关Gremlin的问题时,最好总是将一些示例数据作为Gremlin脚本包括在内)

g.addV('post').property('createdDate',1).as('p1').
  addV('post').property('createdDate',2).as('p2').
  addV('user').as('u1').
  addE('share').to('p2').property('createdDate',0)

首先使用顶点createdDate进行基本排序:

gremlin> g.V().hasLabel('post').
......1>   order().
......2>     by('createdDate').
......3>   valueMap(true)
==>[id:0,label:post,createdDate:[1]]
==>[id:2,label:post,createdDate:[2]]

然后,在coalesce()中使用order()来包含您描述的逻辑:

gremlin> g.V().hasLabel('post').
......1>   order().
......2>     by(coalesce(inE('share').values('createdDate'),
......3>                 values('createdDate'))).
......4>   valueMap(true) 
==>[id:2,label:post,createdDate:[2]]
==>[id:0,label:post,createdDate:[1]]