![](/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.