如何使用 Cypher 在 Neo4j 中复制子图

Raj*_*dam 4 neo4j cypher py2neo

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

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

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

在此输入图像描述

我正在为文件/文件夹实现复制、移动等功能。

移动功能看起来很简单,我可以创建一个新关系并删除旧关系。但复制文件/文件夹需要复制子图。

如何复制子图?

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

Inv*_*con 5

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

对于非 APOC 方法,您需要完成以下任务:

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

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

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

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

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

  • 您可以,您需要使用调用中的 YIELDed“输出”变量,收集它并使用它来完成您想要的操作。例如,您可能有“WITH收集(输出)作为节点”,然后使用[列表理解](https://neo4j.com/docs/cypher-manual/current/syntax/lists/#cypher-list-compressive)要过滤出具有相关标签的标签,然后使用 FOREACH 删除旧标签并添加新标签。我已经提到了一种使用“apoc.algo.cover()”的关系方法。 (4认同)