如何使用 Cypher 在 Neo4j 中复制 Sub-Graph

How to Copy Sub-Graph in Neo4j using Cypher

我正在尝试使用 Neo4j、Cypher 和 Python(Py2Neo) 来模拟文件系统。

我已经创建了如下截图所示的数据模型。

Type=0 表示文件夹,type=1 表示文件。

.

我正在为 files/folders 实现复制、移动等功能。

移动功能看起来很简单,我可以创建一个新关系并删除旧关系。但是复制files/folders需要复制sub-graph.

如何复制sub-graph?

我正在创建一个 python 模块,因此试图避免 apoc。

即使您试图避免 APOC,它已在最新版本中实现了此功能:apoc.refactor.cloneSubgraph()

对于非 APOC 方法,您需要完成以下操作:

  1. 匹配到构成要克隆的子图的不同节点和关系。每个都有一个单独的列表将使这更容易处理。

  2. 克隆节点,并获得从原始节点映射到克隆节点的方法。

  3. 处理关系,找到开始节点和结束节点,并遵循到克隆节点的映射,然后使用克隆节点为关系的开始节点和结束节点创建相同的关系类型,然后从原始关系中复制属性。这样你就与原件没有任何关系,只有克隆。

  4. 确定要重新锚定哪些节点(您可能不想克隆原始节点),并且对于 to/from 这个节点的任何关系,创建它(通过步骤 3 ) 到要用作新锚点的节点(例如,新的 :File 应该是克隆目录树的父节点)。

所有这些在 Cypher 中都很难做到(尤其是第 3 步和第 4 步),因此所有这些都被封装在 apoc.refactor.cloneSubgraph() 中。