Дорогой гремлиновый запрос - можно ли сделать его более эффективным? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть этот запрос gremlin, который я выполняю для базы данных CosmosDB с помощью драйвера Gremlin.net:

g
  .V('Alice')
  .as('v')
  .V('Bob')
  .coalesce(
     __.inE('spokeWith')
    .where(
       outV()
      .as('v')),
    addE('spokeWith')
    .property('date', '10.02.2019 20:16:38').from('v'))

Идея состоит в том, чтобы добавить ребро между двумя узлами, если его не существует.

Проблема в том, что этот запрос кажется очень дорогим, поскольку Azure взимает с меня около 600-1600 единиц запроса.Таким образом, я очень быстро достигаю своего предела пропускной способности.

Есть ли лучший способ выразить этот запрос, чтобы он был дешевле с точки зрения единиц запроса?

1 Ответ

0 голосов
/ 11 февраля 2019

Я не знаю, как CosmosDB предлагает блоки запросов, но я не думаю, что есть более эффективный способ создать преимущество, если его не существует.В обоих сценариях, независимо от того, существует ли уже край или нет, обход действительно просто использует минимальное количество ресурсов:

gremlin> g.addV().property(id, 'Alice').addV().property(id, 'Bob').iterate()
gremlin> g.V('Alice').as('v'). /* CREATE */
           V('Bob').
           coalesce(inE('spokeWith').where(outV().as('v')),
                    addE('spokeWith').property('date', 'xyz').from('v')).
           profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
TinkerGraphStep(vertex,[Alice])@[v]                                    1           1           0.056    13.06
TinkerGraphStep(vertex,[Bob])                                          1           1           0.054    12.74
CoalesceStep([[VertexStep(IN,[spokeWith],edge),...                     1           1           0.319    74.20
  VertexStep(IN,[spokeWith],edge)                                                              0.041
  WhereTraversalStep([WhereStartStep, ProfileSt...                                             0.009
  AddEdgeStep({date=[xyz], ~from=[[SelectOneSte...                     1           1           0.105
    SelectOneStep(last,v)                                              1           1           0.016
                                            >TOTAL                     -           -           0.430        -
gremlin> g.V('Alice').as('v'). /* GET */
           V('Bob').
           coalesce(inE('spokeWith').where(outV().as('v')),
                    addE('spokeWith').property('date', 'xyz').from('v')).
           profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
TinkerGraphStep(vertex,[Alice])@[v]                                    1           1           0.056     9.68
TinkerGraphStep(vertex,[Bob])                                          1           1           0.018     3.09
CoalesceStep([[VertexStep(IN,[spokeWith],edge),...                     1           1           0.509    87.23
  VertexStep(IN,[spokeWith],edge)                                      1           1           0.044
  WhereTraversalStep([WhereStartStep, ProfileSt...                     1           1           0.414
    WhereStartStep                                                     1           1           0.036
    EdgeVertexStep(OUT)                                                1           1           0.331
    WhereEndStep(v)                                                                            0.012
                                            >TOTAL                     -           -           0.583        -

Как видите, в любом случае есть только 1 проход;это не может быть дешевле, чем это.Что ж, если только у Боба нет других входящих spokeWith ребер и CosmosDB не сможет оптимизировать фильтр смежных вершин (where(outV().as('v'))) - в этом случае у вас будет больше траверсеров.Однако я не знаю, как CosmosDB справляется с этим делом под капотом.Возможно, попробуйте .profile() выполнить ваш запрос непосредственно к CosmosDB и обратите внимание на количество проходов.Но с точки зрения TinkerPop ваш обход настолько оптимален, насколько это возможно.

...