私は、merge_one機能をpy2neo v2からv3に適合させる方法を見つけようとしています。 Google groupで、「すべての場合にマージを使用できるはずだから、merge_oneメソッドはもはやv3には存在しません」と読みました。しかし、私は簡単にv3の正規のマージを使用する方法を見つけることができません。py2neo - 新しいプロパティを持つ既存のノードを一意性制約付きで更新する(merge_one)
私はNicole White's neo4j twitter exampleプロジェクトを少し修正して再作成しようとしています。彼女はmerge_oneを使いました。 (u:User) - u.usernameと(t:Tweet) - t.idには一意性制約があります。彼女のスクリプトは常にTweetとUserノードで同じプロパティを持っていますが、時には元に戻って既存のノードにマージを追加したい場合があります。私はエラーを取得するしかし
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)
マージを実行しようとするとき見つけていないので、これは理解してこれらすべてのプロパティを持つ同じツイートと、それを作成しようとするときに、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)
しかしこれは私にとっては反復的なようです。既存のノードを新しいプロパティで更新しても一意の制約(この場合はid)を持つプロパティを指定するなど、py2neoで簡単な方法はありませんか?私はCypherで私はちょうどidにマージを行い、次にマッチに設定するか、createに設定すると思いますが、私はpy2neoでそれを行う方法は分かりません。私はまた、ドキュメント内で、既存のノードを持つ辞書からのプロパティの更新を許可するが、そうでないものを見つけることを試みた。
ありがとう、私はあなたがそのようなプッシュでマージした後、ノードのプロパティを変更することができたことを認識していませんでした。あなたの例は、本当にTwitterでneo4jとpythonを使う方法を学ぶのに役立ちます! –
ありがとう!また、py2neo v3を使用するためにあなたの質問にリンクしたスクリプトを更新しました。 –