Я использую neo4j для хранения временных наборов данных из разных исходных систем. Мои данные состоят из нескольких родительских объектов, каждый из которых содержит ~ 4-7 слоев дочерних объектов разных типов. Общее количество объектов в наборе данных варьируется от 2000 до 1,5 миллиона. Я использую библиотеку python py2neo, которая показала хорошую производительность как на этапе создания данных, так и при передаче шифровальных запросов для отчетов.
Я хотел бы изолировать наборы данных от несвязанных систем для выполнения запросов и очистки, но меня беспокоит производительность. У меня есть несколько идей, но мне не ясно, какие из них, скорее всего, будут жизнеспособными.
Проще всего реализовать (для моего кода) объект «проект» верхнего уровня. Этот объект проекта будет иметь несколько прямых дочерних элементов (через отношения) и много косвенных дочерних элементов. Я беспокоюсь, что когда я хочу отфильтровать по проекту, мне придется использовать подстановочный знак отношения
MATCH (pr:project)<-[:IN_PROJECT*7]-(c:child_object)
Distance, что кажется очень дорогим с точки зрения запросов.Я также мог бы установить прямую связь между объектом проекта и любым другим объектом в проекте.
MATCH (pr:project)<-[:IN_PROJECT]-(c:child_object)
Это должно быть проще для написания запросов, но я не знаю, что может произойти, когда у меня есть один объект с потенциальными миллионами связей.Наконец, я могу установить свойство project-id для каждого отдельного объекта в наборе данных.
MATCH (c:child_object {project-id:"A1B2C3"})
Это кажется расточительным решением, но я думаю, что это может быть лучше с точки зрения производительности в модели графовой БД.
Извините, если я исказил пример запросов Cypher/терминологию neo4j. Я отложил этот проект на 6 недель, и я немного заржавел.