Cypher - 获取最新节点

3
这是我的模型: (:A)<--(:B)<-[:R {时间戳}]-(:C {数字}) 我想在一个cypher查询中实现的目标是,根据给定的A和所有B节点的最新R.timestamp(或C.number),获取最新的C节点。也就是返回一个A,多个B以及与每个B相关的具有最高R.timestamp的一个C。最好还能返回没有与C相关的B节点。
在SQL中,我会通过分组和排名来仅返回每个组中所需的n行,但我没有足够的经验使用COLLECT或UNWIND来实现同样的结果。
1个回答

4
首先找到您的 a 节点,然后可以选择匹配 bc 节点。这也会找到那些与 a 没有关系的 b 节点。
MATCH (a:A)
WHERE a.name = {name}
OPTIONAL MATCH (c:C)-[:R]->(b:B)-[:R]->(a)
WITH a, b, c
ORDER BY c.number
WITH a, b, last(collect(c)) AS most_recent_c
RETURN a, b, most_recent_c;

谢谢,问题已解决。我没有注意到last()函数。或者,可以根据顺序(DESC或ASC)玩一下,并将last()替换为head()。(参见https://neo4j.com/docs/developer-manual/current/#query-function)现在,这不会返回没有与C相关的B节点。我将调查并在此发布结果。 - Rwanou
1
我成功实现了在关系属性上过滤和包含死结B的功能: MATCH (a:A {name: {param}})<--(b:B) with a, b OPTIONAL MATCH (c:C)-[r:R]->(b) // 忽略缺失的C WITH a, b, r, c ORDER BY r.end DESC WITH a, b, head(collect(c)) as most_recent_c, head(collect(r)) as most_recent_r RETURN a, b, most_recent_c, most_recent_r; - Rwanou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接