【问题标题】:Cypher - get the latest nodeCypher - 获取最新节点
【发布时间】:2024-01-21 09:04:01
【问题描述】:

这是我的模型: (:A)<--(:B)<-[:R {timestamp}]-(:C {number})

我试图在一个密码查询中实现的是根据给定 A 和所有 B 节点的最新 R.timestamp(或 C.number)获取最新的 C 节点。即返回一个 A、多个 B 和一个与每个 B 相关的具有最高 R.timestamp 的 C。最好也返回与 C 没有任何关系的 B 节点。

在 SQL 中,我将分组并排名以仅返回我希望每个组的 n 行,我没有足够的 COLLECT 或 UNWIND 经验来获得相同的结果。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    首先找到您的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() 切换。 (参见neo4j.com/docs/developer-manual/current/#query-function)。现在,这不会返回与 C 无关的 B 节点。我会在这里调查并发布结果。
    • 我设法让它同时过滤关系属性并包括死胡同:MATCH (a:A {name: {param}})<--(b:B) with a, b OPTIONAL MATCH (c:C)-[r:R]->(b) // ignore missing 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;