Автоиндекс Neo4j, устаревший индекс и схема меток: различия для полнотекстового поиска относительно узла

на этот вопрос частично дан ответ в neo4j- унаследованные-индексы-и-авто-индекс-против-новой-метки-базы-схемы-индексы и разница-между-устаревшим-indexing-auto-indexing-and-new-indexing-approa

Я пока не могу комментировать их и создать новую тему здесь. В моей базе данных у меня есть устаревший индекс «тема» и метка «Тема».

Я знаю это:

  • а. pattern MATCH (n:Label) будет сканировать узлы;
  • б. шаблон START (n:Index) будет искать по устаревшему индексу
  • в. auto-index является своего рода устаревшим индексом и должен давать те же результаты, что и (b), но в моем случае это не так.
  • д. Пункт START следует заменить на MATCH для «передовой практики».

У меня противоречивые результаты между a. и б. (см. ниже), не может понять, как использовать правильный синтаксис с ПОИСКПОЗ для поиска по индексации вместо меток.

Вот несколько примеров:

1#

start n=node:topic('name:(keyword1 AND keyword2)') return n

6 рядов, 3 мс

start n=node:node_auto_index('name:(keyword1 AND keyword2)') return n;

0 строк

MATCH (n:Topic) where n.name =~ '(?i).*keyword1*.AND.*keyword2*.' return n;

0 строк, 10 000 мс

2#

start n=node:topic('name:(keyword1)') return n

212 строк, 122 мс [все последовательные результаты, содержащие подстроку ключевого слова1]

start n=node:node_auto_index('name:(keyword1)') return n

0 строк

MATCH (n:Topic) where n.name =~ '(?i).*keyword1*.'return n

835 строк, 8 КБ мс [также результаты несвязные, содержащие подстроку eyword]

MATCH (n:Topic) where n.name =~ 'keyword1' return n;

1 строка, >6 КБ мс [точное совпадение]

MATCH (n:topic) where n.name =~ 'keyword1' return n;

нет результатов (здесь я использовал индекс «тема», а не ярлык «Тема»!)

MATCH (node:topic) where node.name =~ 'keyword1' return node;

нет результатов (попытка использовать узел «объект» напрямую, как в синтаксисе автоматического индексирования)

Не могли бы вы помочь пролить свет:

  • В чем разница между устаревшим индексом и автоматическим индексом и почему между ними возникают противоречивые результаты?

  • Как использовать предложение MATCH с индексами, а не с метками? Я хочу воспроизвести результаты полнотекстового поиска.

  • Какой синтаксис для полнотекстового поиска применяется ТОЛЬКО к соседу узла, а не к полной базе данных? СООТВЕТСТВОВАТЬ ? Пункт СТАРТ? унаследованный-индекс ? этикетка? Я запутался.


person user305883    schedule 02.08.2015    source источник
comment
ваш синтаксис регулярного выражения также неверен, это должно работать '(?i).*(keyword1|keyword2){2}.*'   -  person Michael Hunger    schedule 09.08.2015
comment
:Topic - это метка, которая полностью отличается от ручного / устаревшего индекса, они вообще не подлежат обмену.   -  person Michael Hunger    schedule 09.08.2015
comment
В регулярном выражении: ноль или больше - это .*, а не *. !!! так что это (?i).*keyword1*.' должно быть (?i).*keyword1.*'   -  person Michael Hunger    schedule 09.08.2015


Ответы (1)


Автоматический индекс (есть только один) — это ручной (также известный как устаревший) индекс с именем node_auto_index. Этот специальный индекс отслеживает изменения в графе, подключаясь к обработке транзакций. Поэтому, если вы объявили name как часть вашего автоматического индекса для узлов в конфигурации, любое изменение узла, имеющего свойство имени, отражается в этом индексе.

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

Обратите внимание, что ручные или автоматические индексы полностью независимы от меток.

Единственный способ запросить ручной или автоматический индекс — использовать предложение START:

START n=node:<indexName>(<lucene query expression>) // index query
START n=node:<indexName>(key='<value>') // exact index lookup

Индексы схемы совершенно разные и используются в MATCH, когда это уместно.

мой пост в блоге охватывает все индекс возможностей neo4j.

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

Полнотекстовое индексирование см. в другом блоге. сообщение.

обновления на основе кометов ниже

На самом деле MATCH (p:Topic {name: 'DNA'}) RETURN p и MATCH (n:Topic) where n.name = 'DNA' return n оба эквивалентны. Оба приводят к одному и тому же плану запроса. Если на метке Topic и свойстве name (по CREATE INDEX ON :Topic(name)) есть индекс схемы, Cypher будет неявно использовать индекс схемы для поиска указанных узлов.

В настоящее время вы не можете использовать полнотекстовый поиск на основе индексов схемы. Полный текст доступен только при ручном/автоматическом индексировании.

Весь пример, который вы предоставили с START n=node:topic(...), основан на ручном индексировании. Вы несете ответственность за их синхронизацию с содержимым вашего графика, поэтому я предполагаю, что различия связаны с непоследовательными изменениями в графике и не отражают изменения в ручном индексе.

В любом случае, если вы используете START n=node:topic(....), вы никогда не будете использовать индекс схемы.

person Stefan Armbruster    schedule 02.08.2015
comment
Спасибо, @Stefan, но тогда: в чем разница между синтаксисом: MATCH (p:Topic {name: 'DNA'}) RETURN p; и MATCH (n:Topic) where n.name = 'DNA' return n;? И как я могу искать полнотекстовый поиск, используя индекс схемы? Например, как я могу воспроизвести те же результаты, что и: start n=node:topic('name:(DNA*)') return n; и start n=node:topic('name:(DNA* AND gene*)') return n? Почему MATCH (node:Topic) where node.name =~ "DNA*" return node; дает другие результаты, чем start n=node:topic('name:(DNA)') return n, и почему это занимает гораздо больше времени, несмотря на то, что CREATE INDEX ON :Topic(name); был установлен? - person user305883; 02.08.2015
comment
ах-ха! поэтому не могли бы вы привести несколько примеров наилучшего использования индексов схемы, если полнотекстовый формат не поддерживается? Является ли в этом случае наилучший случай применимости для начального обхода графа только числовым? (точное СОВПАДЕНИЕ по id). В вашем блоге я прочитал В настоящее время индексы схемы не могут быть созданы для нескольких свойств, но у вас может быть несколько индексов для одной и той же метки: означает ли это, что я могу объединить полный текст на устаревшем и индексе схемы? Например. полнотекстовый поиск по устаревшему индексу, соответствующему строковому шаблону «Леонардо» с индексом схемы «Артист»? Не могли бы вы также привести пример синтаксиса в шифровании? - person user305883; 03.08.2015
comment
Сочетание индексов схемы и ручных индексов является своего рода антишаблоном. Думайте об индексах схемы как о большой хеш-карте для точного поиска. Для всего остального используйте ручные/автоматические индексы. На заметку: Neo4j 2.3 будет иметь индекс схемы, поддерживаемый LIKE, позволяющий выполнять поиск по префиксу: MATCH (n:Person) where n.name like "Jo%" RETURN n найдет Джона и Джоан через индекс. - person Stefan Armbruster; 03.08.2015
comment
Если полнотекстовое индексирование поддерживается, Какие критерии изначально используются для сортировки результатов для наилучшего соответствия ключевому слову? и как можно взаимодействовать с ним в шифровании? Я открыл другую ветку, вы можете внести свой вклад здесь: [stackoverflow.com/q/31862761/305883] - person user305883; 07.08.2015