Neo4j Cypher查询每个节点返回一行属性

时间:2016-10-26 04:38:41

标签: neo4j cypher

鉴于数据:

  • AdamHonda Civic
  • 中购买了2006
  • AdamBowling Ball
  • 中购买了2008
  • AdamTennis Racket
  • 中购买了2010
  • AdamToyota Camry
  • 中购买了2013
  • AdamHiking Shoes
  • 中购买了2015

我希望能够查询任何给定的时间,看看亚当购买的最后一款运动器材和汽车。 THING个节点具有type属性(carsporting equipment等。)

这有效......

MATCH (person:Person {name: {name})
OPTIONAL MATCH (person)-[bought:BOUGHT]-(thing:THING)
WHERE bought.date <= {date}
RETURN *
ORDER BY thing.date DESC

...但它会返回他在指定日期之前购买的所有东西。我可以在我的应用程序中抓取每个type的第一行,但这是一个人为的例子,实际上我的实际应用程序在老化之前可以看到数千个这样的条目。

如果我放......

LIMIT 1

...最后,我只得到最后一次购买THING(而不是每种类型的最后一个)。

如何构建一个能为我提供类似内容的查询:

查询:告诉我Adam以及他在2011时购买的最后一件事情?

响应:

person                  | bought           | thing
{name: 'Adam', age: 38} | {date: 2010}     | {type: 'sporting equipment', name: 'Tennis Racket'}
{name: 'Adam', age: 38} | {date: 2006}     | {type: 'car', name: 'Honda Civic'}

1 个答案:

答案 0 :(得分:2)

您可以按thing.type汇总:

MATCH (person:Person {name: {name}})
OPTIONAL MATCH (person)-[bought:BOUGHT]-(thing:THING)
WHERE bought.date <= {date}
WITH person, 
     thing, 
     bought ORDER by bought.date DESC
WITH person, 
     thing.type as type, 
     HEAD(collect([thing, bought])) as tmp
RETURN person, 
       tmp[1] as bought, 
       tmp[0] as thing