考虑一个社交媒体网站,其中一个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)
仅当边缘存在时,如何按边缘属性排序,然后回退到不存在的顶点属性排序?