我有一个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;