Neo4j - 以金额和按日期顺序返回LIMIT

时间:2017-08-15 20:58:37

标签: neo4j cypher

背景

  • 我和John和Peter有一个队列,他们都想买450个苹果(数量= r.Amount)
    (队列位置由r.Created给出(早期日期=早期/下级队列位置)

  • 我有鲍勃和琳达都想卖苹果(他们都拥有/拥有r.Amount)
    (两者都有1000个苹果)

    测试控制台:
    http://console.neo4j.org/?id=6xghxm

情景:

  • 第一个场景:400个苹果被出售(无论谁出售)
  • 第二种情景:出售1100个苹果(无论谁卖它)

需要:

  • 只有一个cypher查询两个场景,只有更改 变量400或1100
  • 第一个场景需要:只有约翰被退回,因为他可以购买所有400个苹果,因为他有第一个队列位置
  • 第二 场景需要:两个(约翰和彼得)都被归还,因为两者都是 需要购买1100个苹果或部分苹果


我有这样的想法,但不限制为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;

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}
]}