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

时间:2015-10-07 20:11:06

标签: neo4j cypher

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

此cypher查询不返回任何结果:

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

1 个答案:

答案 0 :(得分:1)

[EDITED]

您似乎没有任何节点,其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;