Gremlin обычно ничего не делает для сохранения порядка и полагается на порядок, предоставляемый базовой базой данных графа.Если вам нужен заказ, то вам нужно указать порядок каким-либо образом.Я думаю, что вы могли бы использовать union()
для этого:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V(1).union(values('name'),values('age')).fold()
==>[marko,29]
gremlin> g.V(1).union(values('age'),values('name')).fold()
==>[29,marko]
Хотя я не уверен, стоит ли полагаться на union()
.Как TinkerGraph должен уважать порядок, указанный там, но я не уверен, будут ли другие графики.Возможно, лучшим решением было бы явное указание с помощью order()
:
gremlin> g.V(1).properties('name','age').order().by(key).value()
==>29
==>marko
Это сортировка по ключам в алфавитном порядке, а не в порядке их ввода.В конечном счете, хотя, если вы просто проверяете результаты, было бы лучше просто вернуть Map
с project()
gremlin> g.V(1).project('name','age').by('name').by('age')
==>[name:marko,age:29]
gremlin> g.V(1).project('age','name').by('age').by('name')
==>[age:29,name:marko]
gremlin> g.V(1).project('age','name').by('age').by('name').next().getClass()
==>class java.util.LinkedHashMap
Как вы можете видеть project()
сохраняет order()
, так как он использует LinkedHashMap
и выполняет модуляторы by()
в порядке их определения.Что приятно, так это то, что вы действительно хотели, чтобы форму List
, о которой вы спрашивали в своем первоначальном вопросе, вы могли просто получить значения из Map
:
gremlin> g.V(1).project('name','age').by('name').by('age').select(values)
==>[marko,29]
gremlin> g.V(1).project('age','name').by('age').by('name').select(values)
==>[29,marko]
Надеюсь, один из этих подходов сработаетдля вашей ситуации.