2016-07-12 4 views
3

私は、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でそれを行う方法は分かりません。私はまた、ドキュメント内で、既存のノードを持つ辞書からのプロパティの更新を許可するが、そうでないものを見つけることを試みた。

答えて

6

py2neo v3にはgraph.merge()が含まれています。これは同じ効果があります。

最初に見つけたり、その後node.push()との他の非固有のプロパティを更新する、独自の特性にのみに一致、graph.merge()とノードを作成します。 graph.merge_one()を使って同じことをしなければならなかったでしょう。ちょっと異なる構文です。

from py2neo import Graph, Node 
graph = Graph() 

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

py2neo v3を使用するようにそのtwitterスクリプトを更新する必要があります。念押し有難う。

+1

ありがとう、私はあなたがそのようなプッシュでマージした後、ノードのプロパティを変更することができたことを認識していませんでした。あなたの例は、本当にTwitterでneo4jとpythonを使う方法を学ぶのに役立ちます! –

+0

ありがとう!また、py2neo v3を使用するためにあなたの質問にリンクしたスクリプトを更新しました。 –

4

2つのもの、

1.) tweet.push()は推奨されていません。ドキュメントはgraph.push(ツイート)の使用を提案しています。

2) 私はこのようなトランザクションでの作業を取得するためにトラブルを抱えています:

transaction = graph.begin() 
transaction.merge(tweet) 
transaction.graph.push(tweet) 
transaction.commit() 

graph.mergetransaction.mergeを使用しての違い上の任意の提案?

+0

答えは実際にはありませんが、私はそれをトランザクションのプッシュメソッドの呼び出しをもたらすように動作させることしかできませんでした... –

関連する問題