如何获取具有最新日期的 neo4j 节点(如果存在)并与当前节点建立连接?

How to get a neo4j node(if it exists) having latest date and create connection with current node?

我正在尝试使用密码在 neo4j 中维护一系列数据节点。 所以我正在创建一个具有当前日期和时间戳的节点。我还需要在当前节点和最新节点之间创建连接。 所以我需要检查节点是否已经存在,如果它们存在,然后获取最新日期的节点并创建 (latest:Node)<-[:next]-(prev:Node)。 如果节点不存在,则只需创建一个具有当前日期的节点。 谢谢

如果您有一个指向最新节点的某种 :Head 节点,那么维护它会更容易。这不仅可以帮助您快速找到最近的节点(无论列表中有多少节点,时间都是恒定的),还有助于协调对该列表的并发更改。

让我们假设单个 :Head 节点与最新节点具有 :Latest 关系。我们需要在检查最近的节点之前锁定 :Head 节点,以避免在执行并发查询时出现竞争条件。

最简单的方法是使用 APOC Procedurescall apoc.lock.nodes()

// assume `latest` node with latest timestamp is already created and in scope
WITH latest
MATCH (head:Head)
CALL apoc.lock.nodes([head]) // avoid race conditions
OPTIONAL MATCH (head)-[r:LATEST]->(prev)
WITH latest, head, r, prev // this + the WHERE needed to halt query if latest isn't newer than prev
WHERE COALESCE(prev.timestamp, 0) < latest.timestamp
DELETE r // update :LATEST relationship
MERGE (head)-[:LATEST]->(latest)
WITH latest, prev
WHERE prev IS NOT NULL // protects from error in case when prev is null
MERGE (latest)<-[:next]-(prev)

请记住,虽然这在新创建的节点现在是最新节点时有效,但它不适用于不比 prev 更新的节点。在这种情况下,他们不会被添加到列表中;您需要修改查询以将节点插入列表中的正确位置。