我为我的数据库中的节点创建了一个非常基本的版本控制系统。我想要做的是编辑时:
(oldreplica)-[:IsPreviousVersionOf]->(replica)
(oldreplica)-[:IsPreviousVersionOf]->(node)
(replica)-[:IsPreviousVersionOf]->(node)
这样我就不必触及节点所拥有的任何关系。我写的每个查询都以节点和副本具有相同的内容结束。
有没有办法做到这一点,还是我需要写两个查询?
答案 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
这样,“最新”版本始终是已经拥有链接的版本,旧版本只是那个版本的副本。