Почему мой запрос Gremlin приводит к такому количеству запросов?Это правильное поведение? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь отладить проблему производительности, связанную с AWS Neptune.Я выполняю некоторые запросы Gremlin, и они, кажется, всегда приводят к 30 запросам в базе данных.Мне интересно, сделал ли я что-то не так в своем запросе.

Странная вещь в этой проблеме заключается в том, что она возникает внезапно.Раньше это работало совершенно нормально, и у нас не было проблем с производительностью.

Каждый выполняемый мной вызов имеет два общих запроса: один для узлов и один для ребер:

nodes = g.V(id).emit().repeat(__.out('manages')).dedup().project('label', 'name', 'job', 'department', 'manager').\
    by(__.id()).by('name').by('job').by('department').by('manager').toList()

id_list = list(map(lambda node: node["label"], nodes))

edges = g.V(id).emit().repeat(__.out('manages')).dedup().bothE('similar_to').dedup().\
    where(__.and_(__.inV().has(T.id, P.within(id_list)), __.outV().has(T.id, P.within(id_list)))).\
    project('from', 'to', 'similarity').by(__.outV().id()).by(__.inV().id()).by('similarity').toList()

По сути, у меня есть два типа ребер: manages и Similar_to.Я пытаюсь создать дерево с помощью ребер 'управляет', а затем нахожу все ребра 'Similar_to' в этом дереве.

Этот запрос дает желаемый результат, но не оптимизирован ли он?

1 Ответ

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

Оба обхода идут по одному и тому же пути, поэтому их легко объединить:

g.V(id).
  emit().
    repeat(__.out('manages')).
  aggregate('x').
  bothE('similar_to').dedup().
  filter(__.otherV().where(P.within('x'))).
  project('from', 'to', 'similarity').
    by(__.outV().id()).
    by(__.inV().id()).
    by('similarity').
  toList()

И теперь я только что понял, что мы можем сделать его еще проще.Поскольку вам требуется, чтобы обе вершины, соединенные similar_to, были частью x, это означает, что каждое ребро в результате должно быть внешним краем для любой из вершин в x.Таким образом, вместо использования bothE и otherV (что позволяет отслеживать пути), мы можем просто использовать outE и inV:

g.V(id).
  emit().
    repeat(__.out('manages')).
  aggregate('x').
  outE('similar_to').dedup().
  filter(__.inV().where(P.within('x'))). /* outV is already guaranteed to be within "x" */
  project('from', 'to', 'similarity').
    by(__.outV().id()).
    by(__.inV().id()).
    by('similarity').
  toList()
...