py2neo:制作节点的深层副本并在本地存储它

时间:2016-03-18 22:06:57

标签: neo4j nodes deep-copy py2neo

是否可以制作节点对象的深层副本并将其存储在任何普通容器(如列表)中,而不是存储在neo4j数据库中?我需要做的是复制我从数据库中检索的节点,然后修改副本的某些属性并临时存储它。然后才将其合并到数据库中。

1 个答案:

答案 0 :(得分:0)

Py2neo Node对象具有unbind方法,该方法将节点与其远程对应方(在数据库中)分离。因此,您可以获取一些Node对象,取消绑定它们,并将它们保存到列表中:

node_list = []
for node in graph.find("Person"):
    node.unbind()
    node_list.append(node)

node_list
------------
[<Node labels={'Person'} properties={'name': 'Jim'}>,
<Node labels={'Person'} properties={'name': 'Anna'}>,
<Node labels={'Person'} properties={'name': 'Sally'}>,
<Node labels={'Person'} properties={'name': 'Joe'}>,
<Node labels={'Person'} properties={'name': 'Bob'}>,
<Node labels={'Person'} properties={'name': 'Mike'}>,
<Node labels={'Person'} properties={'name': 'Billy'}>]

Node对象也支持pickle序列化/反序列化:

import pickle
pickle.dump(node_list, open("nodes.p", "wb"))
node_list_from_pickle = pickle.load(open("nodes.p", "rb"))

node_list_from_pickle
---------------------
[<Node labels={'Person'} properties={'name': 'Jim'}>,
<Node labels={'Person'} properties={'name': 'Anna'}>,
<Node labels={'Person'} properties={'name': 'Sally'}>,
<Node labels={'Person'} properties={'name': 'Joe'}>,
<Node labels={'Person'} properties={'name': 'Bob'}>,
<Node labels={'Person'} properties={'name': 'Mike'}>,
<Node labels={'Person'} properties={'name': 'Billy'}>]

Node对象包含LabelSet(它是set的子类)和PropertySet(它是dict的子类)所以如果你真的想要进行深度复制,你只需要抓住它们Node实例中的两个对象。