我正在尝试对neo4j执行以下操作。 我们的节点具有一组属性。日期是这些属性之一。
我希望返回这些属性,但只能使用最新的日期进行查找。
在SQL中,我的查询将如下所示:
select commonKey, attr1, attr2, dateAttr
from (
select commonKey, attr1, attr2, dateAttr,
row_number(
partition by commonKey
order by commonKey ASC, dateAttr DESC
) rn
from tab
) t
WHERE t.rn = 1
有没有办法在Cypher中实现相同的目标? 有一个collect(dateAttr)[1],但是它将按我需要返回的所有属性(commonKey,attr1,attr2)分组,而我只关心通过commonKey进行“分组”,但是从第一行返回其他属性在小组中。
任何帮助/建议将不胜感激!
谢谢!
-亚历克斯
答案 0 :(得分:1)
我认为您要过早地投影属性。按日期对节点进行排序可能会更好,然后按日期对collect()进行分组并采用第一个节点:
MATCH (n:MyNode)
WHERE ...
WITH n, n.dateAttr as dateAttr
ORDER BY dateAttr DESC
WITH dateAttr, collect(n)[0] as n
RETURN n.commonKey, n.attr1, n.attr2, dateAttr as TDate
或者,您可以使用APOC程序,对于这种情况,该程序具有aggregation functions:
MATCH (n:MyNode)
WHERE ...
WITH n, n.dateAttr as dateAttr
ORDER BY dateAttr DESC
WITH dateAttr, apoc.agg.first(n) as n
RETURN n.commonKey, n.attr1, n.attr2, dateAttr as TDate