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

如何获取具有最新日期的neo4j节点(如果存在),并创建与当前节点的连接?,neo4j,cypher,graph-databases,neo4j-apoc,Neo4j,Cypher,Graph Databases,Neo4j Apoc,我正在尝试使用cypher在neo4j中维护一系列数据节点。 因此,我正在创建一个具有当前日期和时间戳的节点。我还需要在当前节点和最近的节点之间创建连接。 因此,我需要检查节点是否已经存在,如果已经存在,则获取具有最新日期的节点并创建 (latest:Node)如果您有某种类型的:Head节点指向最近的节点,那么维护该节点会更容易。这不仅可以帮助您快速找到最近的节点(无论列表中有多少个节点,时间不变),还可以帮助协调对该列表的并发更改 让我们假设一个:Head节点与最近的节点具有:Latest关

我正在尝试使用cypher在neo4j中维护一系列数据节点。 因此,我正在创建一个具有当前日期和时间戳的节点。我还需要在当前节点和最近的节点之间创建连接。 因此,我需要检查节点是否已经存在,如果已经存在,则获取具有最新日期的节点并创建
(latest:Node)如果您有某种类型的:Head节点指向最近的节点,那么维护该节点会更容易。这不仅可以帮助您快速找到最近的节点(无论列表中有多少个节点,时间不变),还可以帮助协调对该列表的并发更改

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

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

//假设已创建具有最新时间戳的'latest'节点,并且该节点位于作用域中
最新
比赛(头:头)
调用apoc.lock.nodes([head])//避免竞争条件
可选匹配(头部)-[r:最新]->(上一个)
使用latest、head、r、prev//this+如果latest不比prev新,则需要停止查询的位置
其中COALESCE(prev.timestamp,0)(最新)
最新
其中prev不为NULL//防止prev为NULL时出错

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

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

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

//假设已创建具有最新时间戳的'latest'节点,并且该节点位于作用域中
最新
比赛(头:头)
调用apoc.lock.nodes([head])//避免竞争条件
可选匹配(头部)-[r:最新]->(上一个)
使用latest、head、r、prev//this+如果latest不比prev新,则需要停止查询的位置
其中COALESCE(prev.timestamp,0)(最新)
最新
其中prev不为NULL//防止prev为NULL时出错

合并(最新)能否请您在创建之前共享有关检查内容的更多详细信息?基本上,我会沿着
可选匹配(x:SomeLabel)和x的方向去做,其中x不是空的CREATE…
你能在创建之前分享更多关于检查内容的细节吗?基本上,我会沿着
可选匹配(x:SomeLabel)和x的路线,其中x不是空的创建…
谢谢!如果我们是第一次创建节点,即没有以前的节点(最新的节点),该怎么办。而且节点不会太多,所以复杂性不是问题。感谢即使没有以前的节点,查询也应该工作,请尝试一下(您确实需要一个:头节点ThoughThank!如果我们是第一次创建节点,即没有以前的节点(最新的),该怎么办?而且不会有很多节点,所以复杂性不是问题。感谢即使没有以前的节点,查询也应该工作,请尝试一下(但您确实需要:头节点。)
// 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)