Архивирование приложения на основе Neo4j - придерживайтесь API ванили с использованием простых узлов и связей или используйте Spring/GORM?

Я надеюсь услышать от любого из вас, кто проектировал и реализовал приложение Neo4j с приличным размером (10 миллионов узлов /rels ), и какие ваши рекомендации особенно подходят для моделирования и различных API (vanilla java/ groovy Neo4j vs Spring -Data-Neo4j vs Grails GORM/Neo4j).

Мне интересно, действительно ли он рассчитывает добавить дополнительный слой OGM (сопоставление объекта-графика) и связанные с ним абстракции?

Имеет ли кто-нибудь опыт, что лучше всего придерживаться "простого" графического моделирования с узлами + свойствами, отношениями + свойствами, обходами и (например,) Cypher для моделирования и хранения своих данных?

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

Мы магазин Grails, и я экспериментировал с GORM/Neo4J, а также с Spring -data-neo4j.

Основная цель набора данных - моделировать и запрашивать отношения между широкими числами людей, их псевдонимами, их сотрудниками и всеми видами преступной деятельности и истории. Будет более 50 основных классов домена. В модели должна быть гибкость (которая должна быстро развиваться на ранних этапах проекта), а также в скорости и гибкости запросов.

Я должен признаться, я изо всех сил стараюсь найти вескую причину использовать слой OGM, когда я могу использовать (например) POJO или POGO, немного волшебства Groovy и некоторый простой ручной объект домена ↔ node/код сопоставления отношений. Насколько я могу судить, я думаю, что я был бы счастлив, просто имея дело с узлами и обходами и Cypher (иначе KISS). Но я был бы очень рад услышать опыт и рекомендации других людей.

Спасибо за ваше время и мысли,

ТР

Ответ 1

поскольку я являюсь автором плагина Grails Neo4j, я могу быть предвзятым. Основной причиной создания плагина было использование легкости классов домена Grails с их мощными готовыми строительными блоками до Neo4j для ~ 80% случаев использования. Для других 20%, где для конкретных требований требуются такие вещи, как обход и т.д., Мы напрямую используем API-интерфейсы Neo4j (traversals/cypher) и не используем API GORM.

Текущая версия плагина Neo4j страдает от проблемы супернода, поскольку каждый экземпляр домена подключен к подстроке node. Если несколько параллельных запросов (aka threads) добавляют новые экземпляры домена, есть шанс получить исключение блокировки. Я собираюсь исправить это либо подпоследовательным подходом, либо с помощью индексации.

Cypher также можно использовать в плагине Neo4j Grails.

Spring -Data-Neo4j, с другой стороны, представляет собой более продвинутый подход с более точным контролем над деталями отображения, но требует использования конкретных аннотаций. И я не нашел легкого способа интегрировать это в Grails в качестве подмостей.

Мы используем предшествующую версию плагина в продуктивном приложении с ~ 60k пользователями и ~ 10 ^ 6 rels. Из-за NDA я не могу предоставить более подробную информацию об этом.

Ответ 2

Мы не используем grails, но используем гибридное решение neo4j/ spring -data-neo4j. Причина основана на том факте, что некоторые данные нашего домена имеют фиксированную схему, а некоторые нет. SDN отнимает много бремени и может быть смешано с простым neo4j, если возникнет такая необходимость.

У нас есть классы, которые описывают модель данных, объекты для этих классов, которые мы сохраняем с использованием SDN, без дополнительных трюков, мы просто используем основы SDN. Затем мы имеем классы, которые содержат данные для модели, которая не известна заранее. Они хранятся в узлах, содержат специальные свойства для описания того типа модели, к которому относятся данные. Когда neo4j 2 будет выпущен, мы, вероятно, переместим эту информацию в метки. Между этими узлами могут быть отношения, также описанные вышеупомянутой моделью данных, управляемой sdn. У нас также есть отношения от общих узлов к узлам SDN, которые отлично работают, поскольку все заканчивается тем же: узлы.

Мы еще не сталкивались с проблемами, используя этот подход. То, что мы любим больше всего, состоит в том, что данные, о которых мы не знаем в продвинутых способах его моделирования, хранятся в том виде, в котором вы хотели бы хранить данные, когда бы вы знали это заранее, делая фактические данные выбранная модель, которую очень сложно сделать при использовании любой другой (неграфической) базы данных.