Cypher查询获取所有最近更新的节点和关系



我有一个Neo4j数据库,其中所有节点和关系都有一个updatedAt属性,这是在Cypher查询中使用TIMESTAMP()设置的。为了便于讨论,让我们假设所有节点最后一次更新 144444444444之前,并且至少有一个关系在 1444444444之后更新

这个密码查询没有返回结果:

WITH 144444444444 AS timestamp
MATCH (n)
WHERE n.updatedAt >= timestamp
WITH n, timestamp
OPTIONAL MATCH ()-[r]->()
WHERE r.updatedAt >= timestamp
RETURN DISTINCT n, r

以下查询(没有n的时间戳限制)确实返回最近更新的关系(我确实想要)加上所有节点(我不想要):

WITH 144444444444 AS timestamp
MATCH (n)
WITH n, timestamp
OPTIONAL MATCH ()-[r]->()
WHERE r.updatedAt >= timestamp
RETURN DISTINCT n, r

怀疑WHERE n.updatedAt >= timestamp语句可能限制了()-[r]->()语句中可能的开始和结束节点,我尝试了以下操作:

WITH 144444444444 AS timestamp
MATCH (n), (o), (p)
WHERE n.updatedAt >= timestamp
WITH n, o, p, timestamp
OPTIONAL MATCH (o)-[r]->(p)
WHERE r.updatedAt >= timestamp
RETURN DISTINCT n, r

在这里,我显式地允许开始节点是任何节点。但是,再一次,我没有得到最近更新的关系。

我可以使用什么查询来获取自给定时间戳以来已更新的所有节点和所有关系,以及在此时间戳之前未更新的所有节点和关系?


编辑:下面的查询,使用n的可选匹配,似乎可以工作:

WITH 144444444444 AS timestamp
OPTIONAL MATCH (n)
WHERE n.updatedAt >= timestamp
WITH n, timestamp
OPTIONAL MATCH ()-[r]->()
WHERE r.updatedAt >= timestamp
RETURN DISTINCT n, r

所以我的问题是:为什么使用WITH n, o, p, timestamp的查询不能返回最近的关系?

[edit]

看起来没有任何节点updatedAt值>= 144444444444。

这就解释了为什么MATCH (n) WHERE n.timestamp >= timestamp查询不起作用,而OPTIONAL MATCH变体可以。

未能找到匹配的MATCH子句将导致整个查询中止并且不返回任何结果。但是OPTIONAL MATCH子句总是允许查询继续。

如果我是正确的,那么这个查询将不会返回任何行。

WITH 144444444444 AS timestamp
MATCH (n)
WHERE n.updatedAt >= timestamp
RETURN n;

最新更新