按顶点 属性 和边 属性 排序(如果存在)
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 进行排序:
如果 post 有来自用户 I follow
的传入 share
边,按 createdDate
属性 排序share
边缘(按 post 共享的时间排序,而不是 post 的创建日期)。
否则,按post
的createdDate
属性排序。
类似于:
.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]]
考虑一个社交媒体网站,其中 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 进行排序:
如果 post 有来自用户 I
follow
的传入share
边,按createdDate
属性 排序share
边缘(按 post 共享的时间排序,而不是 post 的创建日期)。否则,按
post
的createdDate
属性排序。
类似于:
.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]]