考虑一个社交媒体网站,其中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)
仅当边缘存在时,如何才能按边缘属性排序,而在边缘属性不存在的情况下又退回到顶点属性排序?
答案 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]]