繁体   English   中英

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

[英]Cypher query to get all recently updated nodes and relationships

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

此密码查询不返回任何结果:

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无法返回最近的关系?

[编辑]

看起来您没有任何节点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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM