Предположим, что в графе OrientDB используется следующая модель:
У меня есть вершина Profile. Профили связаны двумя гранями: Понравилось и Откомментировано. Оба ребра имеют поле "value", указывающее количество действий (или "вес" ребра).
Таким образом, если пользователь А 3 раза прокомментировал сообщения пользователя Б, будет ребро Комментировано от пользователя А к пользователю Б со значением = 3.
Теперь предположим, что я хочу отсортировать всех пользователей, взаимодействовавших с пользователем Б (поставивших лайки или прокомментировавших), по весу взаимодействия. Я могу сделать это с помощью следующего SQL:
select * from (traverse out from
(select out, sum(value) as value from
(traverse * from (select from Profile where username="B") while $depth < 3)
where @class="Liked" or @class="Commented" group by out order by value desc)
while $depth < 2 ) where @class="Profile" )
Но что, если я хочу знать также вес взаимодействия? Как мне увеличить «значение» при выполнении последнего хода?
Изменить
Согласно предложению, упрощенная версия этого запроса будет:
select expand(out) from (
select out, sum(value) as value from (
select expand(inE("Liked", "Commented")) from Profile
where username="B"
) group by out order by value desc
)
Но я все еще не могу найти способ использовать LET для вставки значения во внешний развернутый объект. $parent, похоже, не указывает на объект, который расширяется при самом внешнем выборе.
Изменить 2
Я играю с $parent всеми возможными способами. Я не понимаю, как вы можете использовать его в этом случае. Опять же, проблема, которую я пытаюсь решить, заключается в том, как передать сумму (значение) во внешний набор результатов. Я не вижу способа использовать LET для этого при выполнении GROUP BY, и я также не вижу способа использовать LET, когда самый внешний выбор выполняет расширение (поскольку вы не можете делать другие проекции вместе с расширять).
Кроме того, результаты использования $current кажутся не такими, как ожидалось. Например, следующий запрос:
select expand($v) from
(select from
(select expand(inE("Liked", "Commented")) from Profile where @rid=#11:0)
let $v = $current
)
Возвращает это:
{
"result" : [{
"@type" : "d",
"@rid" : "#14:4",
"@version" : 2,
"@class" : "Commented",
"value" : 1,
"out" : "#11:165",
"in" : "#11:0"
}, {
"@type" : "d",
"@rid" : "#14:4",
"@version" : 2,
"@class" : "Commented",
"value" : 1,
"out" : "#11:165",
"in" : "#11:0"
}, {
"@type" : "d",
"@rid" : "#14:4",
"@version" : 2,
"@class" : "Commented",
"value" : 1,
"out" : "#11:165",
"in" : "#11:0"
}
]
}
Один и тот же узел снова и снова вместо всех ребер, чего я и ожидал.