py2neo.ogm 中 GraphObject 的动态属性
Dynamic properties for GraphObject in py2neo.ogm
使用 py2neo 的 ogm 模块,您可以在 neo4j 中为节点构建对象:
class Person(GraphObject):
__primarykey__ = 'name'
name = Property()
def __init__(self, name):
self.name = name
peter = Person('peter')
graph.create(peter)
是否可以向 Person
对象添加动态属性?
peter = Person('peter')
# this does not work
peter.last_name = 'jackson'
graph.create(peter)
可以先创建一个节点,然后再添加属性,但是创建具有动态属性的 GraphObjects
会更容易。
我想出了一种暴力解决这个问题的方法:
撕掉对象的 class,将新的 属性 打入 class 并在对象意识到刚刚发生的事情之前将其塞回对象中 :D
from py2neo.ogm import GraphObject, Property
from py2neo import Graph
class Person(GraphObject):
__primarykey__ = "name"
name = Property()
def __init__(self, name):
self.name = name
def add_new_property(self, name, value):
self.__class__ = type(
type(self).__name__, (self.__class__,), {name: Property()}
)
setattr(self, name, value)
peter = Person("peter")
peter.add_new_property("lastname", "jackson")
g = Graph(host="localhost", user="neo4j", password="neo4j")
tx = g.begin()
tx.merge(peter)
tx.commit()
在这个微型实验室设置中工作。但应该在更复杂的环境中进行测试。
来自 DZD 的欢呼:)
蒂姆
使用 py2neo 的 ogm 模块,您可以在 neo4j 中为节点构建对象:
class Person(GraphObject):
__primarykey__ = 'name'
name = Property()
def __init__(self, name):
self.name = name
peter = Person('peter')
graph.create(peter)
是否可以向 Person
对象添加动态属性?
peter = Person('peter')
# this does not work
peter.last_name = 'jackson'
graph.create(peter)
可以先创建一个节点,然后再添加属性,但是创建具有动态属性的 GraphObjects
会更容易。
我想出了一种暴力解决这个问题的方法:
撕掉对象的 class,将新的 属性 打入 class 并在对象意识到刚刚发生的事情之前将其塞回对象中 :D
from py2neo.ogm import GraphObject, Property
from py2neo import Graph
class Person(GraphObject):
__primarykey__ = "name"
name = Property()
def __init__(self, name):
self.name = name
def add_new_property(self, name, value):
self.__class__ = type(
type(self).__name__, (self.__class__,), {name: Property()}
)
setattr(self, name, value)
peter = Person("peter")
peter.add_new_property("lastname", "jackson")
g = Graph(host="localhost", user="neo4j", password="neo4j")
tx = g.begin()
tx.merge(peter)
tx.commit()
在这个微型实验室设置中工作。但应该在更复杂的环境中进行测试。
来自 DZD 的欢呼:)
蒂姆