Проблема производительности Cosmos gremlin с запросом - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь выполнить этот запрос ниже, но получаю проблему тайм-аута. Где здесь неэффективность?

   g.V().hasLabel('RiskLibrary','name','General 
Business','active','1').as('lib').select('lib').
outE('CONTAINS_RISK').select('lib').project('Risk 
Library','Risks').by('name').by(out('CONTAINS_RISK').project('Name',     
'Description','Impacts','Causes').by('name').by('description').
by(both('IMPACTS').project('name').by('name').fold()).
by(both('CAUSES').project('name').by('name').fold()).fold())

1 Ответ

0 голосов
/ 24 марта 2020

Что-то в вашем обходе кажется неверным. Для начала hasLabel() выглядит так, как будто его вызывают с аргументами, которые не являются метками. Я предполагаю, что обход должен быть:

g.V().has('RiskLibrary', 'name', 'General Business').has('active', '1').as('lib').
      select('lib').
      outE('CONTAINS_RISK').
      select('lib').
      project('Risk Library', 'Risks').
        by('name').
        by(out('CONTAINS_RISK').
           project('Name', 'Description', 'Impacts', 'Causes').
             by('name').
             by('description').
             by(both('IMPACTS').
                project('name').by('name').
                fold()).
             by(both('CAUSES').
                project('name').by('name').
                fold()).
             fold())

Если это правильно, то я бы удивился, какова цель обхода точно. Как сейчас, я бы ожидал, что он будет project('Risk Library', 'Risks') для каждого outE('CONTAINS_RISK'). Для каждого из этих ребер вы получите тот же результат, что и у вас select('lib'), который захватывает оригинал Vertex, из которого вы прошли. Если вы этого не планируете, вы можете представить себе значительную стоимость запроса для выполнения огромного project('Risk Library', 'Risks') снова и снова.

Предполагая, что остальная часть вашего обхода верна, я думаю, вам просто нужно избавиться от метки шага as('lib') и строк до project('Risk Library', 'Risks'), таким образом:

g.V().has('RiskLibrary', 'name', 'General Business').has('active', '1').
      project('Risk Library', 'Risks').
        by('name').
        by(out('CONTAINS_RISK').
           project('Name', 'Description', 'Impacts', 'Causes').
             by('name').
             by('description').
             by(both('IMPACTS').
                project('name').by('name').
                fold()).
             by(both('CAUSES').
                project('name').by('name').
                fold()).
             fold())

Тем не менее, это может быть дорогостоящим обходом в зависимости от того, сколько «ВЛИЯЕТ» и Ребра «CAUSES» существуют для каждой противоположной вершины ребра «CONTAINS_RISK».

...