0

最近、Neo4jを使用できるようにJRuby on Railsに切り替えました。Neo4jでできることのほんの一部にすぎませんが、すでにかなり優れています。とは言うものの、私はインデックス作成と検索に関してかなり厄介な問題に遭遇しました。

Userモデルのcreated_atフィールドとPostモデルのcreated_atフィールドに':index =>:exact'を追加しました(Postモデルのcustom_dateフィールドにはすでにインデックスがあります)。

class User < Neo4j::Rails::Model
  property :created_at, :type => DateTime, :index => :exact

class Post < Neo4j::Rails::Model
  property :created_at, :type => DateTime, :index => :exact
  property :custom_date, :type => DateTime, :index => :exact

次に、Railsコンソールにアクセスして、このコードを試しました(ドキュメントから採用しました)。

User.find( :all, :created_at => 7.days.ago .. DateTime.now ).count

そして、それは0を返しましたが、このコードではそうではないことを私は知っています:

new_users = []
User.all.each{ |user| new_users << user if user.created_at > 7.days.ago }
new_users.count

104を返します。

同様に、私が実行すると

Post.find( :all, :created_at => 7.days.ago .. DateTime.now ).count

私は0を取得しますが、実行すると

Post.find( :all, :custom_date => 7.days.ago .. DateTime.now ).count

305を取得します(投稿のcustom_dateは最初に投稿のcreated_atに設定されます)。唯一の違いは、古いデータベースに移植したときにPostモデルのcustom_dateフィールドにインデックスを配置したことですが、インデックスを追加しただけです。 created_atフィールド。

これが私の質問です:created_atの時間でユーザーと投稿を検索するにはどうすればよいですか?

4

1 に答える 1

0

問題は、古いデータにluceneインデックスがないことです。インデックスを宣言しただけで、古いノードは更新していません。add_indexすべての古いノードでを使用する必要があります。

次のようなことをする必要があります。

Neo4j::Transaction.run do
  User.all.each do |user|
     # Since there is a type converter on created_at, we need to find the data
     # as it is stored in neo4j.
     val = User._converter(:created_at).to_java(user[:created_at])
     user.add_index(:created_at, val) 
  end
end

このhttps://github.com/andreasronge/neo4j/commit/cffe7a4a2fdb83b71e781e717a2a8011e2ef494dのRSpecを参照してください

これを行う方がはるかに簡単だと思うので、githubの問題も作成しました-https ://github.com/andreasronge/neo4j/issues/220

プルリクエストは大歓迎です:)

ところで、neo4jの古い0.4.6バージョンでは、移行でこれを行うためのサポートがありました。

于 2012-10-31T09:20:42.417 に答える