2015-06-23 3 views
1

Мне нужно выполнить сгруппированный агрегат по свойству вершин определенного класса, однако группа по полю является вершиной в двух шагах от моего текущего узла, и я не могу заставить ее работать.Группа OrientDB по запросу с использованием графика

Моего случая: Вершина А содержит свойство я хочу агрегировать и разговаривает п числа вершин с меткой references. Вершиной, которую я хочу сгруппировать, является любая из этих вершин (B, C или D) , если эта вершина имеет ребро defined by до вершины F.

A ----references--> B --defined by--> E 
    \---references--> C --defined by--> F 
    \--references--> D --defined by--> G 
    ... 

Запрос я думал, что будет работать это:

select sum(property), groupOn from (
    select property, out('references')[out('definedBy')[email protected] = F] as groupOn from AClass 
) group by groupOn 

Но это не работает, внутреннее утверждение дает мне странный ответ, который не является правильным (не возвращает вершины), и я подозреваю, что out() не поддерживается для условий брекет (причина [email protected] в том, что документы, которые я нашел заявил, что только «=» поддерживаются.

out('references')[out('definedBy') contains F] не работает, либо, что возвращает out('definedBy') для т он $current vertex).

Любой, у кого есть идея, как этого добиться? В моем примере результат, который мне нужен, - это свойство в одном столбце и @rid вершины C в другом. Затем я могу с радостью выполнить свою группу по агрегатам.

ответ

1

Решено! В OrientDB 2.1 (я пытаюсь rc4) есть новое предложение, которое называется UNWIND (см. SELECT в документах).

Использование UNWIND я могу сделать:

SELECT sum(property), groupOn from (
    SELECT property, out('references') as groupOn 
    FROM AClass 
    UNWIND groupOn 
) WHERE groupOn.out('definedBy')=F 
GROUP BY groupOn 

Это потенциально может быть медленной функцией в зависимости от числа вершин AClass и его ссылки, я доложу, если я найду какие-либо проблемы с производительностью.