我一直在尝试将py2neo v2中的merge_one功能适应到v3中。我在Google group中读到“在v3中,merge_one方法不再存在,因为你应该能够在所有情况下都使用merge。”但我无法弄清楚如何在v3中轻松地使用常规合并。
我正在尝试使用一个小修改来重新创建Nicole White的neo4j twitter示例项目。她使用了merge_one。在(u:User)- u.username和(t:Tweet)- t.id上有唯一性约束。她的脚本始终具有Tweet和User节点的相同属性,但我正在创建一个情况,有时我想返回并使用merge添加更多属性到现有节点。然而,我收到以下错误:
我正在尝试使用一个小修改来重新创建Nicole White的neo4j twitter示例项目。她使用了merge_one。在(u:User)- u.username和(t:Tweet)- t.id上有唯一性约束。她的脚本始终具有Tweet和User节点的相同属性,但我正在创建一个情况,有时我想返回并使用merge添加更多属性到现有节点。然而,我收到以下错误:
py2neo.database.status.ConstraintError: Node 178 already exists with label Tweet and property "id"=[***]
我理解这是因为当我有一个只有id的Tweet已经存在时,然后我尝试做 tw_dict = {'id'=t['id'], 'text':t['text'], 'created':t['created_at'],
'rts':t['retweet_count'],
'favs':t['favorite_count'], 'lang':t['lang']}
tweet = Node("Tweet", **tw_dict)
graph.create(tweet)
合并操作无法找到所有具有相同属性的推文,当它尝试创建一个时,会遇到Tweet ID唯一性约束的问题。看起来merge_one函数可以解决这个问题,但在v3中不可用。因此,我实现了以下解决方案:
exists = graph.find_one("Tweet", "id", t['id'])
if exists:
exists['text'] = t['text']
exists['created'] = t['created_at']
exists['rts'] = t['retweet_count']
exists['favs'] = t['favorite_count']
exists['lang'] = t['lang']
else:
tw_dict = {'text':t['text'], 'created':t['created_at'],
'rts':t['retweet_count'],
'favs':t['favorite_count'], 'lang':t['lang']}
tweet = Node("Tweet", **tw_dict)
graph.create(tweet)
但这对我来说似乎很重复。在py2neo中是否没有更简单的方法来更新具有唯一约束条件(在这种情况下是id)的节点并仍指定属性?我认为在Cypher中,我会对仅id进行合并,然后根据匹配设置或创建进行设置,但我不知道如何在py2neo中实现。我也尝试在文档中找到允许使用现有节点的字典更新属性的内容,但没有找到。