Расширение и группировка коллекции OrientDB

У меня есть следующие классы в моей БД:

  1. Товары{имя:Строка, цена:Двойной, ...}
  2. OrderSpec{товары(1-1):Ссылка, количество:Double}
  3. Заказ{spec(1-*):LinkList, date:Date, ...}

Затем я должен выбрать все товары из заказов с определенной датой, сгруппировать их и сделать некоторые агрегаты, например. Сумма количества для каждого товара. В стандартной базе данных SQL я бы сделал пару объединений, отфильтровал по дате и сгруппировал по goods_id, но не могу понять, как этого добиться в OrientDB. я начал с

select expand(spec) from Order where date = "..."

Но когда я добавляю группировку:

select expand(spec) from Order group by spec.goods

Результат пустой.

В общем, я хотел бы найти эквивалент следующего SQL-запроса:

select goods_id, goods_name, sum(order_spec_quantity), sum(goods_price) from Order
    left join OrderSpec on order_id = order_spec_order_id
    left join Goods on goods_id = order_spec_goods_id
where date = 'some date'
group by goods_id, goods_name

person Aeteros    schedule 13.11.2015    source источник
comment
Можете ли вы указать тип полей OrderSpec и Order? OrderSpec и Order — это вершины или документы?   -  person Alessandro Rota    schedule 13.11.2015
comment
Спасибо за замечания, я добавил типы полей в свой пост. Все объекты являются документами.   -  person Aeteros    schedule 13.11.2015
comment
извините @Aeteros, но спецификация поля (1- *) документа Order - это ссылка или список ссылок?   -  person Alessandro Rota    schedule 13.11.2015


Ответы (2)


с OrientDB вы можете выбрать базу данных Graph для удаления полей PK и FK из вашей базы данных, используя непосредственно вершины и ребра. Я создал пример с кодом и запросами:

create class Goods extends V;
create property Goods.id integer;
create property Goods.name String;

create property Goods.price double;
create property Goods.description String;

create class Order extends V;
create property Order.id integer;
create property Order.dateorder date;
create property Order.country String;

create class orderSpec extends E;
create property orderSpec.quantity integer;

insert into Goods(id,name,price,description) values (1,"oven",260.5,"kitchen");
insert into Goods(id,name,price,description) values (2,"television",300.7,"sitting room");
insert into Goods(id,name,price,description) values (3,"bed",100.3,"bedroom");
insert into Goods(id,name,price,description) values (4,"table",120.4,"dining room");

insert into Order(id,dateorder,country) values (1,"2013-04-12","UK");
insert into Order(id,dateorder,country) values (2,"2014-07-12","Germany");
insert into Order(id,dateorder,country) values (3,"2014-07-12","UK");

create edge orderSpec from (select from Order where id=1) to (select from Goods where id=1) set quantity = 2;
create edge orderSpec from (select from Order where id=1) to (select from Goods where id=2) set quantity = 3;
create edge orderSpec from (select from Order where id=1) to (select from Goods where id=3) set quantity = 2;
create edge orderSpec from (select from Order where id=2) to (select from Goods where id=2) set quantity = 1;
create edge orderSpec from (select from Order where id=3) to (select from Goods where id=2) set quantity = 1;
create edge orderSpec from (select from Order where id=3) to (select from Goods where id=4) set quantity = 2;

А это график:

введите здесь описание изображения

Теперь вы можете запросить БД, чтобы получить всю информацию без операций соединения, используя прямые связи между вершинами.

Фильтрация по статье:

введите здесь описание изображения

Фильтрация по дате:

введите здесь описание изображения

person LucaS    schedule 13.11.2015
comment
Спасибо за такой подробный ответ, но он не распространяется на группировку. Также моя БД использует документы, будет ли она работать с методами in() и out()? - person Aeteros; 13.11.2015
comment
Здесь вы можете найти пример GROUP BY: - person LucaS; 13.11.2015
comment
выберите статью, сумму (id) из (выберите out ('orderSpec'). имя как статью, идентификатор, дату, заказ из заказа раскрутки статьи) группировать по статьям - person LucaS; 13.11.2015
comment
Для вашего второго вопроса вы должны использовать тип Graph DB, если вы хотите использовать функции in() и out() для обхода графа по краям. - person LucaS; 13.11.2015

Попробуйте следующий запрос

select myRid,myName,sum,eval("myPrice * sum") as totalPrice from (select myRid,myName,sum(myQuantity) as sum,myPrice from (select spec.goods.@rid as myRid,spec.goods.name as myName,spec.quantity as myQuantity, spec.goods.price as myPrice from (select spec from Order where date = 'some date' unwind spec )) group by myRid,myName)
person Alessandro Rota    schedule 13.11.2015