基于两个节点neo4j获取不同的值

时间:2014-08-25 13:17:51

标签: neo4j distinct cypher

有许多'用户'节点,任何用户都可以向其他用户汇款。

(:User)-[r:SENT_MONEY]->(:User)

这里r有属性

  • created_at = timestamp()
  • money_transferred =转帐金额

我如何找到一个用户上次向其他用户汇款或在单次查询中从其他用户收到的最后一笔钱。

我试过这个查询

MATCH (from:User)-[r:SENT_MONEY]->(to:User)
where (id(from)=1234 OR  id(to)=1234)
return max(r.created_at) as sent_at,
r.money_transferred as amount, from.username,to.username
order by last_amount_sent_at DESC

结果如下:

sent_at    | amount | from.username | to.username
1408961056 |  20    |   user1 | user2
1408961041 | 30     |   user2 | user1
1408961028 | 50     | user1 | user3
1408951163 | 20     | user4 |   user1
1408951140 | 10     | user1 |   user4

通过此查询,用户“user1”记录“user2”,“user4”记录两次。对于像

这样的用户之间的最后一次交易,它应该是单一的
sent_at    | amount | from.username | to.username
1408961056 |  20    |   user1 | user2
1408961028 | 50     | user1 | user3
1408951163 | 20     | user4 |   user1

1 个答案:

答案 0 :(得分:3)

萨蒂什南比亚,

这是一个我认为会做你需要的查询。

MATCH (m:User {username : 'user1'})-[r:SENT_MONEY]-(n:User)
WITH m, n, collect(r) AS rs, max(r.created_at) AS p
WITH m, n, filter(x IN rs WHERE x.created_at = p) AS l
RETURN STARTNODE(l[0]), ENDNODE(l[0]), l[0]

对于每对用户,您收集事务并查找最后一个事务,然后返回最后一个事务的开始和结束节点。

恩典与和平,

吉姆

在回答您的进一步问题时,您可以像这样修改查询(例如)以避免收集与元素错误:

MATCH (m:User {username : 'user1'})-[r:SENT_MONEY]-(n:User)
WITH m, n, collect(r) AS rs, max(r.created_at) AS p
WITH m, n, filter(x IN rs WHERE x.created_at = p) AS o
RETURN m, n, o[0], (o[0]).money_transferred