![](/img/trans.png)
[英]How can I use py2neo to store a dictionary as one property value to single property key of a node in neo4j?
[英]py2neo - How can I use merge_one function along with multiple attributes for my node?
我已经克服了避免通过使用merge_one函数在数据库上创建重复节点这一问题:
t=graph.merge_one("User","ID","someID")
这将创建具有唯一ID的节点。 我的问题是我找不到将多个属性/属性以及自动添加的ID(例如日期)添加到我的节点的方法。 我已经设法以旧的“重复”方式实现了这一点,但由于merge_one无法接受更多参数,因此现在不起作用! 有任何想法吗???
Graph.merge_one
仅允许您指定一个键值对,因为它打算与节点标签和属性上的唯一性约束一起使用。 通过merge_one
通过其唯一ID查找节点,然后设置属性有什么问题吗?
t = graph.merge_one("User", "ID", "someID")
t['name'] = 'Nicole'
t['age'] = 23
t.push()
我知道我来晚了...但是我认为仍然有用
使用py2neo == 2.0.7和文档(关于Node.properties
):
...,后者是扩展dict的PropertySet的实例。
所以以下对我有用:
m = graph.merge_one("Model", "mid", MID_SR)
m.properties.update({
'vendor':"XX",
'model':"XYZ",
'software':"OS",
'modelVersion':"",
'hardware':"",
'softwareVesion':"12.06"
})
graph.push(m)
这个hacky函数将遍历属性,值和标签,并逐渐消除所有与提交的每个条件都不匹配的节点。 最终结果将是与所有提供的属性和标签匹配的所有(如果有)节点的列表。
def find_multiProp(graph, *labels, **properties):
results = None
for l in labels:
for k,v in properties.iteritems():
if results == None:
genNodes = lambda l,k,v: graph.find(l, property_key=k, property_value=v)
results = [r for r in genNodes(l,k,v)]
continue
prevResults = results
results = [n for n in genNodes(l,k,v) if n in prevResults]
return results
通过将两个函数组合在一起,最终结果可用于评估唯一性并(如果为空)创建一个新节点...
def merge_one_multiProp(graph, *labels, **properties):
r = find_multiProp(graph, *labels, **properties)
if not r:
# remove tuple association
node,= graph.create(Node(*labels, **properties))
else:
node = r[0]
return node
例...
from py2neo import Node, Graph
graph = Graph()
properties = {'p1':'v1', 'p2':'v2'}
labels = ('label1', 'label2')
graph.create(Node(*labels, **properties))
for l in labels:
graph.create(Node(l, **properties))
graph.create(Node(*labels, p1='v1'))
node = merge_one_multiProp(graph, *labels, **properties)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.