1

我想知道是否有一种聪明的方法可以在 neo4django 中创建节点的精确克隆,而无需手动复制每个属性和关系。

p = Person.create(name="John Doe")
p.connect(...)

new_p = p 

不会工作,因为new_p不会是克隆(具有相同内容的新的单个节点),而是指向同一节点的不同指针。

4

1 回答 1

2

那么你需要一个图中的新节点,还是 Django 模型的副本?

要创建具有相同属性(但关系不同)和新图中节点的副本,您可以尝试类似

p = Person.objects.create(name="John Doe")
p2 = Person.objects.create(**p.node.properties)

对人际关系做同样的事情有点困难,但我过去做过,如果你需要的话,我可以写一个要点。或者,如果更合适的话,这也可以在 Gremlin 或 Cypher 中完成(使用 neo4django 的辅助函数),例如

from neo4django.db import connection
p = Person._neo4j_instance(connection.gremlin('results=<some code that yields a copied node>'))

如果您只需要一个不同 Python 对象的 Django 模型副本(但仍附加到同一节点),您可以尝试

>>> p = Person.objects.create(name="John Doe")
>>> p2 = Person.from_model(p)
>>> print p2.name
John Doe

编辑:

我怎么会忘记 - 有一个包含的便捷方法!

>>> john = Person.objects.create(name="John Doe")
>>> john_2 = john.copy_model()
>>> john.name == john_2.name
True

尽管返回的模型未保存,但关系和属性都被复制了——它们在图中不共享节点。

抱歉跑来跑去,也许这会更容易一些。

于 2013-05-25T20:50:36.180 回答