Императивное соответствие в TinkerPop / CosmosDB - PullRequest
0 голосов
/ 16 мая 2018

Я хочу сделать запрос, подобный этому

g.V().match(
  as('foo').hasLabel('bar'),
  as('foo').out('baz').hasId('123'),
  as('foo').out('baz').hasId('456')
)
.select('foo').by('id')

, который предназначен для выбора id всех узлов типа bar, имеющих ребра bazна все указанные узлы.

Однако CosmosDB поддерживает только подмножество из TinkerPop Gremlin , а match() входит в число шагов обхода, которые не поддерживаются.

Чтоспособ сформулировать вышеупомянутый запрос, используя только поддерживаемые конструкции ?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я думаю, что вам нужно условие "и" для идентификаторов в смежных вершинах, поэтому я бы выбрал один из следующих подходов:

g.V().hasLabel('bar')
  and(out('baz').hasId('123'),out('baz').hasId('456'))
  .id()

или, возможно, (обратите внимание, что «2» в is(2) должно быть равно количеству идентификаторов, которые вы пытаетесь проверить):

g.V().hasLabel('bar')
  where(out('baz').hasId('123','456').count().is(2))
  .id()

Я предпочитаю этот второй подход, я думаю, поскольку вы только итерируете out('baz') один раз, чтобы подтвердить фильтр. Вы можете сделать его немного более производительным, добавив limit(2) следующим образом:

g.V().hasLabel('bar')
  where(out('baz').hasId('123','456').limit(2).count().is(2))
  .id()

Таким образом, фильтр where() выйдет как можно раньше, в зависимости от того, как быстро вы найдете вершины «123» и «456». Я полагаю, что наложение limit() также защитит вас от ситуаций, когда у вас есть более одного ребра к этим вершинам, и вы в конечном итоге посчитаете больше, чем вам действительно нужно для успеха where().

0 голосов
/ 17 мая 2018

Вы можете сделать что-то вроде этого

 g.V().hasLabel('bar').as('a').out('baz').hasId(within('123','456')).select('a').id()

В большом количестве случаев вы можете избежать использования шага match.

Cheers Kelvin

...