Я не знаю, как 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 ваш обход настолько оптимален, насколько это возможно.