Оптимизированы ли идентификаторы узлов Neo4J для доступа?

Я создаю большую базу данных графов, используя neo4j.

У меня есть собственные внешние индексы, которые дают мне идентификаторы соответствующих узлов, которые я использую для дальнейшего обхода графа neo4j. Другими словами, у меня уже есть идентификаторы начальных узлов, когда я получаю запрос к базе данных.

Мой вопрос: может ли поиск узлов быть быстрее, если я использую индексы neo4j/lucene для доступа к соответствующим узлам?

Или такие запросы, как:

START n=node({ids})

уже оптимизирован для доступа к узлу, и ничего нельзя получить, используя:

START n=node:nodeIndexName(key={value})

?

Спасибо,


person user2467218    schedule 08.06.2013    source источник


Ответы (1)


да. Neo4j оптимизирован для Node ID, так как на уровне постоянства все узлы представляют собой блок, поэтому доступ к узлу 100 аналогичен доступу к блоку 100.

Однако я предупрежу вас, что Neo4j не дает никаких гарантий относительно идентификатора узла, если вы его удалите. Neo4j восстанавливает идентификаторы. Поэтому, если в течение жизни вашей БД вы удаляете и добавляете несколько узлов, ваши внешние записи могут быть «действительными», но не такими, как вы ожидаете.

// РЕДАКТИРОВАТЬ: Кроме того, почему бы просто не использовать Lucene для выполнения поиска? Конечно, доступ к идентификатору узла выполняется быстрее, но это то, что Lucene делает под прикрытием, когда вы выполняете поиск, поэтому key:name, value:frank вернет node id 5123, а neo4j вернет узел, соответствующий этому идентификатору.

person Nicholas    schedule 08.06.2013
comment
Хорошо сказано. Лучше сделать свои собственные идентификаторы, если вы выполняете внешний поиск. - person Eve Freeman; 09.06.2013
comment
@WesFreeman Точно, просто используйте UUID в качестве свойства и индекса. - person Nicholas; 09.06.2013
comment
@Nicolas: Спасибо, на самом деле я использую Lucene для поиска, но мои поиски основаны на сложных полнотекстовых запросах со специальным синтаксисом и выделенными потоками токенов, поэтому в данный момент я запускаю их извне. Результатом поиска являются идентификаторы узлов. Так что я пока останусь с ними и посмотрю, не создаст ли это проблем с сохранением, о которых вы упомянули... - person user2467218; 10.06.2013
comment
Более безопасным вариантом было бы использовать UUID в качестве индекса свойства/lucene в Neo4j и хранить этот UUId снаружи, когда вы хотите выполнить внешний поиск. - person Nicholas; 10.06.2013