В этом случае с CosmosDB может что-то происходить, а это значит, что вам, возможно, придется получить от них конкретную c помощь. Обратите внимание, что ваш обход работает (почти так, как написано) с TinkerGraph, который является эталонной реализацией того, как Gremlin должен работать:
gremlin> g = TinkerFactory.createTheCrew().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:14], standard]
gremlin> g.V().has('person','name','marko').
......1> sideEffect(properties("location").drop()).
......2> property(list,'location','bombay').
......3> property(list,'location','calcutta').
......4> project('location').
......5> by(values('location').fold())
==>[location:[bombay,calcutta]]
Возможно, вам следует попробовать свой запрос с моим by()
модулятор на project()
, чтобы увидеть, если добавленный fold()
имеет какое-либо значение. Между прочим, я не ожидаю, что ваш обход без fold()
вернет то, что вы говорите, оно возвращает. Обратите внимание, что происходит с TinkerGraph, если я попробую это:
gremlin> g.V().has('person','name','marko').
......1> sideEffect(properties("location").drop()).
......2> property(list,'location','bombay').
......3> property(list,'location','calcutta').
......4> project('location').
......5> by(values('location'))
==>[location:bombay]
Замена шага project()
на optional(g.V("1").project("Tags").by(values("Tags")))
- этот работает путем повторной загрузки вершины, но стоит дорого.
Вышеуказанное является интересным моментом, хотя у меня есть личная неприязнь к использованию g
для порождения дочерних обходов, поэтому я предпочел бы анонимный обход, порожденный как optional(V("1").project("Tags").by(values("Tags")))
. Это заставляет меня задуматься, не отражает ли CosmosDB мутации в текущем traverser, и именно поэтому вы получаете искомый результат при повторном запросе sh, выполняя повторный запрос. Я удивлен, что поиск в середине обхода обходится дорого, так как это поиск по элементу id
и должен быть самым быстрым способом поиска вещей на графике. Тем не менее, это не так приятно, что вам приходится искать Vertex
более одного раза в одном и том же обходе.
Из любопытства вы можете попробовать valueMap(true)
вместо project()
в качестве другого теста, просто чтобы посмотреть, вызывает ли это какое-либо другое поведение.
Еще одна вещь, которую можно попробовать, - использовать union()
вместо sideEffect()
:
gremlin> g.V().has('person','name','marko').
......1> union(properties("location").drop(), identity()).
......2> property(list,'location','bombay').
......3> property(list,'location','calcutta').
......4> project('location').
......5> by(values('location').fold())
==>[location:[bombay,calcutta]]
, чтобы увидеть, имеет ли это какое-либо значение.