Как перестроить индекс Luone Neo4j?- Neo4j.rb - PullRequest
1 голос
/ 16 сентября 2011

Я работаю на Neo4j (1.4), используя Neo4j.rb gem (1.2.2) на Rails 3.1

Я столкнулся с проблемой, когда индекс neo4j был поврежден, что я больше не могу запустить базу данных, как упоминалосьнесколько форумов типа this Я удалил db / index dir, и это сработало.Однако мне нужно заново перестроить индекс.

Я не смог найти в документации нигде информацию о том, как перестроить индекс, кто-нибудь может помочь?

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 29 ноября 2011

Моя проблема была похожей - после обновления до neo4j 1.5 (с 1.4) мои индексы были повреждены.Мой случай: у меня было два индекса:

  • __types__: для индексации типа сохраняемых объектов (предоставляется spring-data-neo4j 2.0.0.RC1)
  • User: для индексации поля имени пользователя, поэтому я мог выполнять поиск после них

Это привело к серьезной проблеме, когда я мог найти все узлы по их идентификатору, но не мог выполнить поиск после имени пользователя или перечислить все объекты определенногоtype.

Исправление (я предоставлю код Java, но идея будет такой же и на других языках):

/* begin a transaction */
Transaction tx = graphDatabaseService.beginTx(); 
/* for all nodes in the database */
for (Node node : graphDatabaseService.getAllNodes()) { 
    /* reconstruct the saved object based on the __type__ property on the node - the result is a class that was annotated with @NodeEntity */
    DefaultDbNode ddn = neo4jTemplate.createEntityFromStoredType(node,
            null);
    /* reindex this node, adding it to the __types__ index, with key "className" (it is used by spring-data-neo4j) with the value __type__ */
    graphDatabaseService.index().forNodes("__types__")
            .add(node, "className", node.getProperty("__type__")); 
    /* if the reconstructed object is a User object */
    if (ddn instanceof User) { 
        /* add it to the User index, with the key "username" (which is also the saved fields name) */
        graphDatabaseService.index().forNodes("User")
                .add(node, "username", node.getProperty("username")); 
    }
}
/* end transaction */
tx.success();
tx.finish();

Надеюсь, это поможет вам или кому-то другому!

1 голос
/ 13 января 2012

Спасибо всем, кто пытался помочь. В моем случае я успешно решил проблему, приняв следующие меры:

Шаг 1 Следуя рекомендации Михаила Голодного из Neo4j (через список рассылки), я использовал инструмент checkindex для удаления поврежденных записей индекса Lucene и Solr Checkindex

Шаг 2 После удаления поврежденных записей индекса остается проблема их построения, чтобы Lucene мог снова начать запрашивать их. Это может быть просто сделано с использованием Model.addindex (: index_name). Обратите внимание, что эта операция должна быть заключена в Neo4j :: Transaction. В моем случае я запустил его на railsconsole, но я полагаю, вы также можете кодировать их в приложении rails.

Пример:

Neo4j::Transaction.run do
  User.all.each do |user|
    user.add_index(:first_name)
    user.add_index(:email)
    user.save
  end
end

Надеюсь, это поможет другим, кто сталкивается с такими же проблемами.

Приветствия

1 голос
/ 19 сентября 2011

Вы должны зайти в каталог вашей базы данных и удалить

  • Каталог с именем index
  • Файл index.db

и позже пройти через дырунабор узлов и ребер, обновляющий свойства каждого узла.

/ purbon

...