В чем разница между индексом и внутренним идентификатором в neo4j? - PullRequest
1 голос
/ 05 июня 2019

Я настраиваю свою базу данных, и иногда мне нужно использовать идентификатор.Сначала я добавил ID в качестве свойства к интересующим меня узлам, но понял, что могу также просто использовать внутренний идентификатор neo4j "".Затем я наткнулся на метку CREATE INDEX ON: (что-то) и подумал, что именно это будет делать?Я думал, что индекс и будет то же самое?

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

Кроме того, я читал о том, какого родабазы данных для использования (mySQL, MongoDB или neo4j) и выбрал neo4j, так как мои данные в значительной степени соответствуют структуре графа.(он будет использоваться для построения моделей метаболизма: гены соединений-> белки-> реакции-> соединения)

В SQL синтаксис казался слишком сложным, так как мне пришлось обходить несколько таблиц, чтобы создать простые соединения, которые neo4jвыполняет довольно легко ... Из того, что я понимаю, MongoDb хранит данные независимо, и, поскольку мои данные связаны, на самом деле кажется, что они не соответствуют структуре данных.Но опять же, поскольку мои знания по этому вопросу ограничены, возможно, я не делаю правильный выбор?

Заранее спасибо.

1 Ответ

2 голосов
/ 05 июня 2019

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

Что касается индексов и идентификаторов, вот индексная секция документов, но суть в том, что это связано с тем, как Neo4j может искать начальные узлы. Neo4j использует только индексы для поиска этих начальных узлов (хотя в 3.5, когда мы выполняем поиск индекса таким образом, если у вас есть ORDER BY в индексированном свойстве, он будет использовать индекс для увеличения производительности упорядочения).

Вот что Neo4j попытается использовать, в зависимости от доступности, от самого быстрого до самого медленного:

  1. Поиск по внутреннему идентификатору - это всегда быстро, однако мы не рекомендуем сохранять эти внутренние идентификаторы вне контекста запроса. Причина этого заключается в том, что при удалении элементов графа их идентификаторы становятся пригодными для повторного использования. Если вы сохраните внутренние идентификаторы за пределами Neo4j и выполните их поиск позже, есть вероятность, что все, на что вы ожидали ссылаться, могло быть удалено и может указывать на что-либо, или может указывать на какой-то новый узел с совершенно другим данные.

  2. Поиск по индексу - здесь, где вы хотите использовать CREATE INDEX ON (или добавить уникальное ограничение, если это имеет смысл для вашей модели). Когда вы используете MATCH или MERGE, используя метку и свойство (или свойства), связанные с индексом, это быстрый и прямой поиск нужных вам узлов.

  3. Поиск по сканированию меток - если вы выполняете МАТЧ с меткой, присутствующей в шаблоне, но не имеете возможности использовать индекс (либо нет индекса для комбинации метка / свойство, либо присутствует только метка, но нет свойства), то сканирование метки будет выполнено, и каждый узел данной метки будет сопоставлен и отфильтрован. Это становится дороже, так как добавляется больше узлов с этими метками.

  4. Сканирование всех узлов - если вы не предоставите никакой метки в шаблоне MATCH, то каждый узел в вашей базе данных будет сканироваться и фильтроваться. Это очень дорого, так как ваш БД растет.

Вы можете ОБЪЯСНИТЬ или ПРОФИЛИРОВАТЬ запрос, чтобы увидеть его план запроса, который покажет вам, какие средства поиска используются для поиска начальных узлов, а остальные операции - для выполнения запроса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...