背景:
我和John和Peter有一个队列,他们都想买450个苹果(数量= r.Amount)
(队列位置由r.Created给出(早期日期=早期/下级队列位置)
我有鲍勃和琳达都想卖苹果(他们都拥有/拥有r.Amount)
(两者都有1000个苹果)
情景:
需要:
我有这样的想法,但不限制为1,而是将其限制为400或1100与所有r.announces的SUM(r.Amount)相结合,但我认为这样做不可能:
MATCH (Pe:Person)-[a:announces]-(Pr:Product)
RETURN Pe.name, a.Amount
ORDER BY a.Created ASC
LIMIT 1;
答案 0 :(得分:0)
我有一个new console来演示我的答案(它恢复Bob和Linda节点,但它们与Apple节点有sells
的关系。它还为买方的priority
节点添加Person
属性,以表示队列顺序。
这是我的问题:
MATCH (:Person)-[s:sells]-(pr:Product {name: 'Apples'})
WITH pr, SUM(s.Amount) AS nAvailable
MATCH (p:Person)-[a:announces]->(pr)
WITH nAvailable, {p: p, amt: a.Amount} AS pa
ORDER BY pa.p.priority
RETURN
REDUCE(s = {unsold: nAvailable, res: []}, x IN COLLECT(pa) |
CASE
WHEN s.unsold = 0 THEN s
WHEN x.amt <= s.unsold THEN {unsold: s.unsold-x.amt, res: s.res + {p: x.p, amt: x.amt}}
ELSE {unsold: 0, res: s.res + {p: x.p, amt: s.unsold}}
END
) AS result;
它计算可供销售的苹果数量,然后通过买方队列 - 收集有关能够购买任何苹果的买家的信息。结果是一个对象具有苹果的unsold
数字,以及成功买家的res
信息集合。
以下是示例的结果:
{unsold:1100, res:[
{"p":{"_id":3,"_labels":["Person"],"name":"John","priority":10},"amt":450},
{"p":{"_id":4,"_labels":["Person"],"name":"Peter","priority":20},"amt":450}
]}