繁体   English   中英

py2neo-如何为节点使用merge_one函数以及多个属性?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM