Neo4j 在Cypher查询中使用WITH进行聚合

Neo4j 在Cypher查询中使用WITH进行聚合,neo4j,cypher,Neo4j,Cypher,对于以下2个节点:(a)-[rel]-(b),其中(a)具有唯一属性,如Id,并且(b)具有时间戳属性 对于给定数量的Id值,我希望检索(b)节点,该节点具有连接到(a)节点的最新时间戳。之后,我打算在最新的(b)中设置一些属性 我编写的查询类似于: Match p=(a)-[rel]-(b) where a.Id IN ["id1","id2","id3","id4","id5"] WITH MAX(b.timestamp) as MAXT MATCH (b) where b.timestam

对于以下2个节点:(a)-[rel]-(b),其中(a)具有唯一属性,如Id,并且(b)具有时间戳属性

对于给定数量的Id值,我希望检索(b)节点,该节点具有连接到(a)节点的最新时间戳。之后,我打算在最新的(b)中设置一些属性

我编写的查询类似于:

Match p=(a)-[rel]-(b) where a.Id IN ["id1","id2","id3","id4","id5"] WITH MAX(b.timestamp) as MAXT MATCH (b) where b.timestamp=MAXT SET b.prop1=value1, b.prop2=value2
但这只返回了连接到所有(a)节点的所有(b)节点中的一个(b)节点

我尝试使用ORDER BY after和进行分组,但效果不佳:

Match p=(a)-[rel]-(b) where a.Id IN ["id1","id2","id3","id4","id5"] WITH MAX(b.timestamp) as MAXT ORDER BY a  MATCH (b) where b.timestamp=MAXT SET b.prop1=value1, b.prop2=value2
我想在单个查询中实现这一点,因为Id的数量是巨大的。因此,最好在单个查询中执行,而不是在多个查询中执行

我们将不胜感激

问候,


Rahul

由于要查找每个
a
节点的最大值,因此无法按
排序方式
限制
进行全局排序。相反,您需要使用
每个
a
的最大时间戳以及
b
节点的集合进行传递。在下一步(此处为
返回
)中,将过滤后者的最大值
head
函数用于仅返回过滤集合的第一个元素(即具有最大时间戳的节点):


也可以在所有
b
s的时间戳上使用
ORDER BY
,如下所示:

MATCH (a)-[rel]-(b) 
WHERE a.Id in [...]
WITH a, b 
ORDER BY b.timestamp DESC
WITH a, head(collect(b)) as b
SET b.prop1=value1, b.prop2=value2

这种方法在服务器端会有很大的内存开销,因为需要填充和排序包含所有时间戳的全局列表。
MATCH (a)-[rel]-(b) 
WHERE a.Id in [...]
WITH a, b 
ORDER BY b.timestamp DESC
WITH a, head(collect(b)) as b
SET b.prop1=value1, b.prop2=value2