【问题标题】:py2neo - How can I use merge_one function along with multiple attributes for my node?py2neo - 如何为我的节点使用 merge_one 函数和多个属性?
【发布时间】:2015-04-16 15:37:56
【问题描述】:

我已经克服了避免在我的数据库上创建重复节点的问题,方法是使用像这样工作的 merge_one 函数:

t=graph.merge_one("User","ID","someID") 

创建具有唯一 ID 的节点。我的问题是我找不到将多个属性/属性与自动添加的 ID(例如日期)一起添加到我的节点的方法。 我已经设法实现了这个旧的“重复”方式,但它现在不起作用,因为 merge_one 不能接受更多参数!有什么想法???

【问题讨论】:

    标签: python properties neo4j py2neo


    【解决方案1】:

    Graph.merge_one 只允许您指定一个键值对,因为它旨在与节点标签和属性的唯一性约束一起使用。通过 merge_one 的唯一 id 找到节点然后设置属性有什么问题吗?

    t = graph.merge_one("User", "ID", "someID")
    t['name'] = 'Nicole'
    t['age'] = 23
    t.push()
    

    【讨论】:

      【解决方案2】:

      我知道我来晚了……但我觉得还是有用的

      使用 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)
      

      【讨论】:

        【解决方案3】:

        这个 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多