Valuemap возвращает массив
В Tinkerpop3 valueMap возвращает массив, как я могу получить реальную пару ключ-значение (без массива)?
gremlin> Gremlin.version()
==>3.0.1-incubating
:> def trav = g.V().hasLabel('Group'); trav.valueMap()
==>{joinTime=[2016-12-05T22:27:01.088Z], groupId=[9de5-45cf-b40d-e357b40e87b1], mCanInvite=[true]}
:> def trav = g.V().hasLabel('Group'); trav.local(properties().group().by(key()).by(value()))
==>{joinTime={2016-12-05T22:27:01.088Z=1}, groupId={9de5-45cf-b40d-e357b40e87b1=1}, mCanInvite={true=1}
4 ответа
Это ожидаемое поведение. См. http://tinkerpop.apache.org/docs/current/reference/
Если вы не хотите, чтобы значение было заключено в массив, добавьте .by(unfold())
к valueMap()
В твоем случае
def trav = g.V().hasLabel('Group');
trav.valueMap().by(unfold());
Теперь вы можете использовать.elementMap()
и он делает то же самое, что и.valueMap(true)
за исключением того, что он не возвращается с массивами.
Вы можете попробовать использовать select, он возвращает пары ключ-значение. Например:
g.V().hasLabel('Group').as('name','count')
.select('name','count')
.by('groupName')
.by(outE('contains').count())
результат будет примерно таким:
[{'name':'group1', 'count':10},...]
name представляет значение свойства groupName, count - сколько у ребер есть группа.
Я столкнулся с теми же проблемами, которые я не смотрел. Я решил использовать приведенные ниже запросы.
g.V().hasLabel('user').project('id','firstName','age','userid',).by('id').by('firstName').by('age').by('userid')
Результат :
[
{
"id": "thomas",
"firstName": "Thomas",
"age": 44,
"userid": 1
},
{
"id": "mary",
"firstName": "Mary",
"age": 39,
"userid": 2
}
]
Примечание. Это вернет ошибку, если вершина не имеет свойства запроса. В моем случае Azure Cosmos DB Gremlin API все мои документы в качестве свойств.
при попытке запросить базу данных Cosmos db свойства .ValueMap работают, но возвращают массив
g.V().hasLabel('user').valueMap('firstName')
Результат:
[
{
"id": [],
"firstName": [
"Thomas"
]
},
{
"id": [],
"firstName": [
"Mary"
]
}
]