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

时间:2017-12-01 22:42:04

标签: neo4j cypher graph-databases neo4j-apoc

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

1 个答案:

答案 0 :(得分:3)

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

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

最简单的方法是APOC Procedures使用call 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更新的节点。在这种情况下,它们不会被添加到列表中;您需要修改查询以将节点插入列表中的适当位置。