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

Order by vertex property and edge property if it exists

考虑一个社交媒体网站,其中 user(顶点)可以 share(边缘)另一个 user.[=26= 的 post(顶点) ]

构建用户提要时,它看起来像这样:

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")
  )

到目前为止一切顺利,但我需要使用以下逻辑对这些 post 进行排序:

类似于:

.order()
.by(
  __.inE("share")
  .as("shareEdge")
  .outV()
  .in_("follow")
  .hasId(myUserId)
  .select("shareEdge")
  .properties("createdDate"),
  order.decr
    )
.by("createdDate", order.decr)

问题是并非所有 post 都有 share 边,所以这会引发错误。

Error: GraphQL error: Error: Error: Server error: {"requestId":"53e7e66c-302e-4521-ac39-b672b4cb52e6","code":"InvalidParameterException","detailedMessage":"The provided traverser does not map to a value: 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)

如何仅在存在边 属性 的情况下按边排序,然后退回到顶点 属性 不存在的地方排序?

我认为你可以用 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]]

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

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]]