如何复制节点并在Cypher中设置原始值

时间:2015-07-02 12:04:07

标签: neo4j cypher

我为我的数据库中的节点创建了一个非常基本的版本控制系统。我想要做的是编辑时:

  1. 复制节点
  2. 更新节点
  3. 链接(oldreplica)-[:IsPreviousVersionOf]->(replica)
  4. 删除(oldreplica)-[:IsPreviousVersionOf]->(node)
  5. 链接(replica)-[:IsPreviousVersionOf]->(node)
  6. 增加节点上的版本号
  7. 这样我就不必触及节点所拥有的任何关系。我写的每个查询都以节点和副本具有相同的内容结束。

    有没有办法做到这一点,还是我需要写两个查询?

2 个答案:

答案 0 :(得分:1)

您可以在一个查询中执行此操作;我认为你缺少的两件作品是如何首先复制节点,以及如何加入"使用WITH关键字的子查询。这是一个例子。您应该对此查询进行三重检查,因为您的术语和关系转移很棘手,因此请仔细验证这是您想要的。

这里的WITH块将某些匹配的节点绑定到您可以在后续查询中使用的变量。通过这种方式,我们可以将一个查询的结果转移到另一个查询中。另一点是节点只是它们属性的映射,所以你可以复制"通过将一个地图设置为另一个地图来节点。

MATCH (node:Content{version:1})
WITH node as oldNode
CREATE (copy:Cotent)
SET copy=oldNode
WITH oldNode, copy
MATCH (oldreplica:Content{version:0})
MERGE (oldNode)-[:IsPreviousVersionOf]->(copy)
MERGE (oldreplica)-[oldRel:IsPreviousVersionOf]->(copy)
DELETE oldRel
WITH copy, oldNode
MERGE (copy)-[:IsPreviousVersionOf]->(oldNode)
MERGE (oldreplica)-[:IsPreviousVersionOf]->(copy);

答案 1 :(得分:1)

好的,我已经明白了!

// Find the editable Node
MATCH (mainNode)-[:HasInternal]->(:EditableUuid{uuid:'2828b80b-e3d8-478e-ad31-b791b4e8d318'})
// Create a copy and copy the contents
CREATE (copy:Content)
SET copy = mainNode

// Create a new subquery so that we don't set the contents of both copy and mainNode
WITH mainNode, copy
// Increment the version number on the mainNode
SET mainNode.version = mainNode.version + 1
// Connect replica to the mainNode
MERGE (copy)-[:IsPreviousVersionOf]->(mainNode)

// Create a new subquery where we change the links of any old versions
with mainNode, copy, copy.version - 1 as oldversion
// Find older versions and connect them to the copy
MATCH (oldreplica:Content{version:oldversion})-[oldRel:IsPreviousVersionOf]->(mainNode)
MERGE (oldreplica)-[:IsPreviousVersionOf]->(copy)
// Delete the old relationship of the nodes
DELETE oldRel

这样,“最新”版本始终是已经拥有链接的版本,旧版本只是那个版本的副本。