Выберите вершину, если ребро вершины имеет значение свойства, в противном случае выберите другую вершину с другим значением свойства ребра. - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь получить вершины, соединяющие Запрос вершины с каждой Картой вершины. Отношение карты к запросу - один ко многим (каждая карта имеет много запросов).

Карта может быть подключена к запросу со свойством "Status": "In Use", если карта используется. Каждая карта также будет связана со многими запросами со свойствами "Status": "Future Use" или "Past Use".

Я пытаюсь создать таблицу, в которой отображаются самые последние данные об использовании каждой карты.

Таким образом, я хочу вернуть запрос, если ребро, соединяющее его с картой, имеет свойство "Status": "In Use".

Если карта в данный момент не используется, я смотрюдля запроса, который последний раз использовал карту ("Status": "Past Use").

Если карта никогда не использовалась, я ищу ближайший предстоящий запрос, который будет использовать карту ("Status":"Future Use").

Я пытался использовать coalesce:

.coalesce(
 select('request')
  .outE().hasLabel('AssignedTo}').has('Status', 'In Use'),
 select('request')
  .outE().hasLabel('AssignedTo').has('Status', 'Past Use').order().by('Timestamp', decr).limit(1),
 select('request')
  .outE().hasLabel('AssignedTo').has('Status', 'Future Use').order().by('Timestamp', incr).limit(1)
).as('status')

Но это возвращает только одну запись (Используется). Другая версия:

.coalesce(
 select('card')
  .inE().hasLabel('AssignedTo}').has('Status', 'In Use'),
 select('card')
  .inE().hasLabel('AssignedTo').has('Status', 'Past Use').order().by('Timestamp', decr).limit(1),
 select('card')
  .inE().hasLabel('AssignedTo').has('Status', 'Future Use').order().by('Timestamp', incr).limit(1)
).as('status')

Это вернуло только две записи (обе в использовании).

Я пытался choose некоторое время назад и не мог заставить это работать (не помнючто именно произошло).

Ожидается:

Возвращает одну вершину со ребром со свойством "Status": "In Use".

Если этого ребра не существует, получите самую последнюю вершину, имеющую ребро, со свойством "Status": "Past Use".

Если нет подходящих ребер, получите самую ближайшую предстоящую вершину, которая имееткрай со свойством "Status": "Future Use".

1 Ответ

1 голос
/ 07 ноября 2019

Я не уверен, что пошло не так с вашим запросом, поскольку вы не опубликовали его полностью, но это должно работать:

g.V().hasLabel("Card").as("c").coalesce(
    outE("assigned").has("status", "In Use"),
    outE("assigned").has("status", "Past Use").order().by("Timestamp", desc).limit(1),
    outE("assigned").has("status", "Future Use").order().by("Timestamp", asc).limit(1),
).as("s").inV().as("r")
.select("c","s","r").by("name").by("status").by("name")
...