В Gremlin, как на самом деле работает map ()? - PullRequest
0 голосов
/ 25 июня 2018

Почему эти два дают разные результаты?

graph.traversal()
   .V().map(__.out("contains"))
.valueMap(true).next(100)

по сравнению с

graph.traversal()
   .V().out("contains")
.valueMap(true).next(100)

Почему я предпочитаю map непосредственному вызову метода .out ()? Таким образом, я могу организовать свой код, где я могу получить обходы от методов и «сопоставить» с существующими обходами.

1 Ответ

0 голосов
/ 25 июня 2018

Размышляя над этой проблемой, вспомните, что Gremlin чем-то напоминает конвейер обработки, где объекты протягиваются через каждый шаг конвейера для применения некоторого преобразования, фильтрации и т. Д. Итак, учитывая ваш пример в наиболее упрощенной форме, высказал бы, что вы получаете все вершины и проходите по out() ребрам, что означает, что вы сравниваете следующие обходы и результаты:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().out()
==>v[3]
==>v[2]
==>v[4]
==>v[5]
==>v[3]
==>v[3]
gremlin> g.V().map(out())
==>v[3]
==>v[5]
==>v[3]

Эти обходы возвращают два разных результата, потому что вы запрашиваете у Гремлин дваразные вещи.В первом случае out() не является формой map(), это является формой flatMap(), что означает, что для каждого проходящего через конвейер вершины он будет перебирать все исходящие ребра, проходить и возвращать соседниевершина (то есть преобразование один ко многим).Во втором случае вы просите Gremlin сделать простую map() вершины с другим объектом (то есть преобразование «один к одному»), что в этом случае будет результатом out(), который является первым объектом в этомtraverser stream.

Чтобы продемонстрировать, вы можете просто изменить map() на flatMap() следующим образом:

gremlin> g.V().flatMap(out())
==>v[3]
==>v[2]
==>v[4]
==>v[5]
==>v[3]
==>v[3]

или, альтернативно, fold() результаты out() на один объект дляподдерживать логику преобразования один в один:

gremlin> g.V().map(out().fold())
==>[v[3],v[2],v[4]]
==>[]
==>[]
==>[v[5],v[3]]
==>[]
==>[v[3]]
...