【问题标题】:How to get a neo4j node(if it exists) having latest date and create connection with current node?如何获取具有最新日期的 neo4j 节点(如果存在)并与当前节点建立连接?
【发布时间】:2017-12-01 22:42:03
【问题描述】:

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

【问题讨论】:

  • 您能否分享更多关于您在创建之前检查的内容的详细信息?基本上,我会去OPTIONAL MATCH (x:SomeLabel) WITH x WHERE x IS NOT NULL CREATE ...

标签: neo4j cypher graph-databases neo4j-apoc


【解决方案1】:

如果您有一个指向最新节点的某种类型的 :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 更新的节点。在这种情况下,它们不会被添加到列表中;您需要修改查询以将节点插入到列表中的适当位置。

【讨论】:

  • 谢谢!如果我们第一次创建节点,即没有前一个节点(最新),该怎么办。也不会有很多节点,所以复杂性不是问题。谢谢
  • 即使没有前一个节点,查询也应该可以工作,试一试(你确实需要一个 :Head 节点
猜你喜欢
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
相关资源
最近更新 更多