2012-10-30 3 views
0

Nous avons récemment basculé sur JRuby on Rails pour pouvoir utiliser Neo4j, et même si nous n'avons fait qu'effleurer la surface de Neo4j, c'est déjà génial. Cela dit, je viens de rencontrer un problème plutôt irritant avec l'indexation et la recherche.Indexation des anciennes données avec Neo4j et jRuby on Rails

Je viens d'ajouter « : index =>: exacte » à mon champ created_at de modèle utilisateur et sur le terrain created_at de mon modèle Post (il y avait déjà un index sur mon champ custom_date de modèle Post):

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 

Je puis est entré dans la console pour rails essayé ce code (qui je me suis adapté de the documentation):

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

Et il est revenu 0, que je sais est pas le cas de ce code:

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

retours 104.

De même, quand je lance

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

je reçois 0, mais quand je lance

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

Je reçois 305. (le custom_date d'un poste est initialement fixé à La seule différence est que j'avais l'index en place sur le champ custom_date du modèle Post quand nous avons porté sur l'ancienne base de données, alors que je viens juste d'ajouter l'index au champ created_at.

Voici ma question: comment puis-je rechercher mes utilisateurs et mes publications en fonction de leur période de création?

Répondre

0

Le problème est que les anciennes données n'ont pas d'index lucene. Vous avez seulement déclaré un index mais pas mis à jour les anciens nœuds. Vous devez utiliser le add_index sur tous les anciens nœuds.

Vous devriez faire quelque chose comme ceci:

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 

Voir la RSpec pour cette https://github.com/andreasronge/neo4j/commit/cffe7a4a2fdb83b71e781e717a2a8011e2ef494d

J'ai aussi créé un problème de github parce que je pense qu'il devrait être beaucoup plus facile de le faire - https://github.com/andreasronge/neo4j/issues/220

demandes de traction sont les bienvenus :)

BTW, dans l'ancienne version de 0.4.6 Neo4j il y avait un soutien pour faire ceci avec des migrations.

+0

A travaillé parfaitement! Je vous remercie. Je voudrais prendre un coup de main pour aider et créer un Model.reindex! méthode, mais je ne suis qu'un développeur/concepteur front-end minutieux mis en service en tant qu'ingénieur back-end; vous ne me voudriez pas dans un rayon de dix pieds de votre code. – jwest

Questions connexes