Упорядочить по свойству вершины и свойству ребра, если оно существует - PullRequest
0 голосов
/ 01 января 2019

Рассмотрим сайт социальной сети, где 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 "," detailsMessage ":" Предоставленный traverser не сопоставляется со значением: 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 (последняя, ​​shareE), NoOpBarrierStep (2500), PropertiesStep ([madeDate], свойство)] "} (499)

Как можно отсортировать по свойству ребра, только если ребро существует, и вернуться к свойству вершиныСортировать, где это не так?

1 Ответ

0 голосов
/ 07 января 2019

Я думаю, что вы можете решить это с помощью 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]]
...