Неправильный результат запроса запроса Gremlin
Предположим, у меня 3 студента (A,B,C), у которых есть основной предмет и оценки соответственно, но когда я запрашиваю результат, показанный неравномерно.
Данные
A -> Математика -> 77
B -> История -> 70
C -> Наука -> 97
запрос
g.V('Class').has('name',within('A','B','C'))
Результат
{"student_name":['A','B','C'], "major_subject":['Math','Science','History'], "marks":[70,77,97]}
Данные, отображаемые при запросе к базе данных, не в порядке в соответствии с именем студента.
1 ответ
Решение
Я предполагаю, что ваш график выглядит примерно так:
g = TinkerGraph.open().traversal()
g.addV('student').property('name', 'A').
addE('scored').to(addV('subject').property('name', 'Math')).
property('mark', 77).
addV('student').property('name', 'B').
addE('scored').to(addV('subject').property('name', 'History')).
property('mark', 70).
addV('student').property('name', 'C').
addE('scored').to(addV('subject').property('name', 'Science')).
property('mark', 97).iterate()
Теперь самый простой способ собрать данные:
gremlin> g.V().has('student', 'name', within('A', 'B', 'C')).as('student').
outE('scored').as('mark').inV().as('major').
select('student','major','mark').
by('name').
by('name').
by('mark')
==>[student:A,major:Math,mark:77]
==>[student:B,major:History,mark:70]
==>[student:C,major:Science,mark:97]
Но если вы действительно зависите от формата, показанного в вашем вопросе, вы можете сделать это:
gremlin> g.V().has('student', 'name', within('A', 'B', 'C')).
store('student').by('name').
outE('scored').store('mark').by('mark').
inV().store('major').by('name').
cap('student','major','mark')
==>[major:[Math,History,Science],student:[A,B,C],mark:[77,70,97]]
Если вы хотите, чтобы результат с заглавными буквами был упорядочен по отметкам, вам понадобится сочетание двух запросов:
gremlin> g.V().has('student', 'name', within('A', 'B', 'C')).as('a').
outE('scored').as('b').
order().
by('mark').
inV().as('c').
select('a','c','b').
by('name').
by('name').
by('mark').
aggregate('student').by(select('a')).
aggregate('major').by(select('b')).
aggregate('mark').by(select('c')).
cap('student','major','mark')
==>[major:[History,Math,Science],student:[B,A,C],mark:[70,77,97]]
Заказать по порядку входов:
gremlin> input = ['C', 'B', 'A']; []
gremlin> g.V().has('student', 'name', within(input)).as('a').
order().
by {input.indexOf(it.value('name'))}.
outE('scored').as('b').
inV().as('c').
select('a','c','b').
by('name').
by('name').
by('mark').
aggregate('student').by(select('a')).
aggregate('major').by(select('b')).
aggregate('mark').by(select('c')).
cap('student','major','mark')
==>[major:[97,70,77],student:[C,B,A],mark:[Science,History,Math]]