1

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

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

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来自用户 I 的传入边follow,则按createdDate该边的属性share排序(按帖子的共享时间排序,而不是帖子的创建日期)。

  • 否则,按 的createdDate属性排序post

就像是:

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

问题是并非所有帖子都有share优势,所以这会引发错误。

错误:GraphQL 错误:错误:错误:服务器错误:{"requestId":"53e7e66c-302e-4521-ac39-b672b4cb52e6","code":"InvalidParameterException","detailedMessage":"提供的遍历器未映射到值: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)

仅当边缘存在时,如何按边缘属性排序,然后回退到不存在的顶点属性排序?

4

1 回答 1

4

我认为你可以用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()inorder()包含您描述的逻辑:

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]]
于 2019-01-07T12:38:01.157 回答