0

Neo4j で jRuby on Rails を使用していますが、非常に奇妙なエラーが発生します。現在、投稿を作成できるユーザーがいます。ごくまれに、Post オブジェクトではなく、「投稿」リレーションシップでラップされていないノードを取得するようです。たとえば、コンソールで 1 人のユーザーの投稿を反復処理したところ、次のようになりました。

> user.posts.each{ |post| puts post }
#<Post:0x49ca112d>
#<Post:0xc9ddbea>
#<Post:0x7e706c75>
Node[438144]
#<Post:0x769dba83>

これらの投稿以外の投稿のいずれかのプロパティまたはリレーションシップにアクセスしようとするたびに、次のようなエラーが発生するため、これはあらゆる種類の問題を引き起こしています。

undefined method `[any property or relationship]' for #<Java::OrgNeo4jKernelImplCore::NodeProxy:0x461784b6>

これらの裸のノードは、人々の「投稿」関係に断続的に追加されているようで、ノードを手動で削除できますが、作成され続けるため、これはせいぜい応急処置に過ぎないようです。

ですから、私の質問は、(1) これらの非 Post オブジェクトが最初から作成されないようにするにはどうすればよいですか? また、(2) これらのオブジェクトのデータベースを削除するにはどうすればよいでしょうか?

4

1 に答える 1

1

この動作の理由の 1 つはprotected_keys、ノードを更新するとき (neo4j-wrapper gem のみを使用するとき) に使用することです。

何らかの理由で _classname プロパティが消えたのではないかと思います (これはprotected_keysconf を使用して発生する可能性があります。以下の github の問題を参照してください)。たとえば、投稿ではないユーザー投稿関係に投稿を追加しました (値が「Post」の _classname プロパティがありません)。

たとえば、このようなことをすると、次の問題が発生します。

user.posts << Neo4j::Node.new

すべての投稿オブジェクトに _classname プロパティがあることを確認するために、デバッグをお勧めします。

これが neo4j.rb のバグである場合は、ラップされたオブジェクトをロードするために次の醜い回避策を実行できます。

user.posts.map{|p| p.wrapper}.each{ |post| puts post }

この場合に備えて github の問題を追加しました 。テストケースも非常に便利です。

于 2012-12-19T10:09:51.080 に答える