уточните пожалуйста следующие моменты:
1. цена `price` указывается для товара `productId`,
а как нам узнать цену товара `productPairId` ?
2. если не секрет, расскажите почему вы выбрали модель в которой может быть не более двух товаров в покупке?
3. может ли цена меняться часто - и необходимо учитывать последнюю цену?
запрос может выглядеть так:
MACTH
(p1:Product {productId:'Сигнал'})<-[:HAS_PRODUCT]-(psc:Purchase)
WITH
p1, psc
ORDER BY
psc.purchasedAt DESC
WITH //получаем последнюю стоимость заданного товара
p1, collect(psc)[0].price as lastPrice1
MACTH
(p1)-[:HAS_CATEGORY]->(c2:Category)<-[:HAS_CATEGORY]-(p2)<-[:HAS_PRODUCT]-(psc:Purchase)
WITH DISTINCT
p1, lastPrice1, p2, psc
ORDER BY
psc.purchasedAt DESC
WITH //получаем последнюю стоимость товаров из тех же категорий
p1, lastPrice1, p2, collect(psc)[0].price as lastPrice2
WHERE //оставляем более дешевые
lastPrice1 > lastPrice2
MATCH
(p2)
OPTIONAL MATCH
(p2)<-[:HAS_PRODUCT|HAS_PAIR_PRODUCT]-(psc:Purchase)
WHERE // считаем оплаты за последний месяц, при этом учитываем оба товара в оплате
psc.purchasedAt > timestamp() - 60*60*24*30*1000
RETURN p2, count(psc) as cnt
ORDER by cnt DESC
LIMIT 5