小编Nei*_*son的帖子

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

我一直在试图找到一种方法来使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.我还尝试在文档中找到允许从具有现有节点的字典更新属性但不能更新的东西.

neo4j cypher py2neo

5
推荐指数
2
解决办法
5604
查看次数

标签 统计

cypher ×1

neo4j ×1

py2neo ×1