0

我们最近切换到 JRuby on Rails 以便我们可以使用 Neo4j,尽管我们只触及了 Neo4j 的皮毛,但它已经非常棒了。也就是说,我只是在索引和查找方面遇到了一个相当棘手的问题。

我刚刚在我的用户模型的 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 回答