我想知道是否有一种聪明的方法可以在 neo4django 中创建节点的精确克隆,而无需手动复制每个属性和关系。
p = Person.create(name="John Doe")
p.connect(...)
new_p = p
不会工作,因为new_p
不会是克隆(具有相同内容的新的单个节点),而是指向同一节点的不同指针。
我想知道是否有一种聪明的方法可以在 neo4django 中创建节点的精确克隆,而无需手动复制每个属性和关系。
p = Person.create(name="John Doe")
p.connect(...)
new_p = p
不会工作,因为new_p
不会是克隆(具有相同内容的新的单个节点),而是指向同一节点的不同指针。
那么你需要一个图中的新节点,还是 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
尽管返回的模型未保存,但关系和属性都被复制了——它们在图中不共享节点。
抱歉跑来跑去,也许这会更容易一些。