gpt4 book ai didi

neo4j - py2neo-使用具有唯一性约束的新属性更新现有节点(merge_one)

转载 作者:行者123 更新时间:2023-12-04 16:38:53 27 4
gpt4 key购买 nike

我一直在尝试找出一种方法,以将merge_one功能从py2neo v2调整为v3。我在Google group中读到,“v3中不再存在merge_one方法,因为您应该可以在所有情况下都使用merge。”但我不知道如何在v3中轻松使用常规合并。

我正在尝试通过小的修改来重新创建Nicole White's neo4j twitter example项目。她使用了merge_one。 (u:User)-u.username和(t:Tweet)-t.id有唯一性约束。她的脚本对于Tweet和U​​ser节点始终具有相同的属性,但是我提出一种情况,有时我想返回并通过合并将更多属性添加到现有节点。但是我得到了错误
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,并且当它尝试创建一个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进行合并,然后在match上设置或在create上设置,但是我看不到如何使用py2neo做到这一点。我还试图在文档中找到一些东西,该东西将允许从具有现有节点的字典中更新属性,但不能。

最佳答案

py2neo v3现在具有graph.merge(),您可以使用它来达到相同的效果。

首先使用graph.merge()查找或创建节点,仅在其唯一属性上进行匹配,然后使用node.push()更新其其他非唯一属性。您将不得不使用graph.merge_one()做相同的事情,只是语法略有不同。

from py2neo import Graph, Node
graph = Graph()

tweet = Node('Tweet', id=123)
graph.merge(tweet)
tweet['text'] = 'Hello World'
tweet.push()

我应该更新该Twitter脚本以使用py2neo v3;感谢您的提醒。

关于neo4j - py2neo-使用具有唯一性约束的新属性更新现有节点(merge_one),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38334386/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com