Написание запроса "внешнего соединения" в Gremlin для AWS Neptune (без использования лямбда-шагов) - PullRequest
1 голос
/ 16 октября 2019

Я хочу вернуть отдельные ветки git пользователя на основе следующих условий:

  • Не возвращать основную ветку
  • Возвращать ветви без связанных запросов на получение
  • Возвращать ветви, связанные с запросами на получение, когда ни один из запросов на выборку не открыт или объединен.

Итак, учитывая следующие примеры данных,

user = graph.addVertex(label, 'User', 'name', 'John')
branch1 = graph.addVertex(label, 'Branch', 'name', 'branch1')
branch2 = graph.addVertex(label, 'Branch', 'name', 'branch2')
branch3 = graph.addVertex(label, 'Branch', 'name', 'branch3')
branchmaster = graph.addVertex(label, 'Branch', 'name', 'master')
user.addEdge('AUTHOR_OF', branch1)
user.addEdge('AUTHOR_OF', branch2)
user.addEdge('AUTHOR_OF', branch3)
user.addEdge('AUTHOR_OF', branchmaster)
pr2 = graph.addVertex(label, 'PullRequest', 'name', 'pr2', 'state', 'OPEN')
pr3 = graph.addVertex(label, 'PullRequest', 'name', 'pr3', 'state', 'DECLINED')
branch2.addEdge('SOURCE_OF', pr2)
branch3.addEdge('SOURCE_OF', pr3)
pr22 = graph.addVertex(label, 'PullRequest', 'name', 'pr22', 'state', 'MERGED')
branch2.addEdge('SOURCE_OF', pr22)
pr23 = graph.addVertex(label, 'PullRequest', 'name', 'pr23', 'state', 'DECLINED')
branch2.addEdge('SOURCE_OF', pr23)

Я хочу вернуть ответвление 1(потому что нет связанных PR) и branch3 (потому что связанный PR отклонен)

Следующий запрос не работает на AWS Neptune, поскольку Neptune не поддерживает лямбда-шаги:

g.V().hasLabel('User')
  .out('AUTHOR_OF')
  .hasLabel('Branch')
  .has('name', neq('master'))
  .where(out('SOURCE_OF')
    .hasLabel('PullRequest').values('state').fold()
    .filter{ !(it.get().contains('OPEN') || it.get().contains('MERGED')) })
  .dedup()
  .order().by('updated_at', desc)

1 Ответ

2 голосов
/ 16 октября 2019

Вместо этого можно использовать предикат within:

g.V().hasLabel('User')
  .out('AUTHOR_OF')
  .hasLabel('Branch')
  .has('name', neq('master'))
  .where(__.not(out('SOURCE_OF').hasLabel('PullRequest').has('state', within(['OPEN','MERGED']))))
  .dedup()
  .order().by('updated_at', desc)
...