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

Nei*_*son 5 neo4j cypher py2neo

我一直在试图找到一种方法来使py2neo v2中的merge_one功能适应v3.我在谷歌小组中读到"在v3中不再存在merge_one方法,因为你应该能够在所有情况下使用合并." 但我无法弄清楚如何在v3中轻松使用常规合并.

我试图通过一个小修改重新创建Nicole White的neo4j twitter示例项目.她使用了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的推文然后我尝试做

        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)
Run Code Online (Sandbox Code Playgroud)

merge并没有找到包含所有这些属性的相同推文,并且当它尝试创建一个正在运行到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)
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎是重复的.在py2neo中是否有更简单的方法来执行诸如使用新属性更新现有节点并仍然指定具有唯一约束的属性(在本例中为id)?我认为在Cypher中我会对id进行合并,然后设置匹配或设置为create但我不知道如何使用py2neo.我还尝试在文档中找到允许从具有现有节点的字典更新属性但不能更新的东西.

Ben*_*ire 8

两件事情;

1.)tweet.push()已被弃用.文档建议使用graph.push(tweet).

2.)我无法使用以下事务处理此事务:

transaction = graph.begin()
transaction.merge(tweet)
transaction.graph.push(tweet)
transaction.commit()
Run Code Online (Sandbox Code Playgroud)

关于使用graph.mergetransaction.merge?的区别的任何建议?


Nic*_*ite 7

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()
Run Code Online (Sandbox Code Playgroud)

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