【问题标题】:How can I copy a path in Neo4j?如何在 Neo4j 中复制路径?
【发布时间】:2016-02-23 19:17:37
【问题描述】:

我想在 Neo4j 中重新创建整个节点链和关系。

我知道我可以用p= 保存路径,但CREATE 不接受。

MATCH p=(:Person)-[*]->(:Dog) CREATE p

有没有办法做到这一点?

【问题讨论】:

  • 您可以尝试使用nodes(p)relationships(p)
  • 您能解释一下为什么要在同一个数据库中创建一组路径的完全相同的副本吗?这通常是您想要避免的。如果我们知道您实际上想要完成什么,也许我们可以提出更好的方法。
  • @cybersam 太真实了,人们通常希望避免这种情况。在我的情况下没关系,我正在填充样本数据,所以可以有重复。还有其他填充样本数据的方法,但这是一个理论问题。我有点惊讶我尝试的命令不起作用。 “不可能”的答案是完全可以接受的,或者如果有办法做到这一点,知道会很有趣。无论哪种方式,答案都应该伴随着“警告:你可能不想这样做”,正如你所提到的。
  • @cybersam 我有一个用例,我想重复使用一组节点作为“模板”(并且有多个模板),这些节点被复制并附加到其他地方。现在我正在使用 py2neo 以编程方式创建它们并从 cypher 脚本文件中读取 CREATE 命令,但是完全在 db 上操作会很好。

标签: neo4j cypher


【解决方案1】:

如您所见,您尝试的语法不起作用,因此必须尝试编写大量 Cypher 代码来复制每个路径的所有部分。

但是,事实证明目前无法单独使用 Cypher 来复制任意路径 - 因为缺少一些所需的功能。

例如,尽管您可以使用LABELS() 函数获取包含现有节点标签的集合,但无法从该数据创建/设置另一个节点的标签。 Cypher 仅支持硬编码标签(创建节点时,如CREATE (n:Foo);更新节点时,如SET n:Foo)。类似的考虑也适用于关系类型。

【讨论】:

  • 目前正在验证是否没有一种相当简单的方法可以完成此任务。如果我找到一个,我会发布它。如果没有,我会接受你的回答。
【解决方案2】:

警告:通常会创建与节点的附加关系,而不是在图形数据库中重复节点。

这不是严格 Cypher,而是在the Neo4j shell 中工作。它应该从 Neo4j 2.0.0 开始工作。提醒一句:这被列为实验性和不完整的功能。

dump MATCH (pers:Person)-[r*:OWNS]->(d:Dog) RETURN pers,r,d;

您可以直接执行返回的输出来复制节点。如果 ID 已经存在,它们将被更改。将使用相同的标签和属性创建节点和关系。

这对于备份数据库非常方便。

More info on the dump command

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多