Neo4j 在Cypher查询中使用WITH进行聚合
对于以下2个节点:(a)-[rel]-(b),其中(a)具有唯一属性,如Id,并且(b)具有时间戳属性 对于给定数量的Id值,我希望检索(b)节点,该节点具有连接到(a)节点的最新时间戳。之后,我打算在最新的(b)中设置一些属性 我编写的查询类似于: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
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