Я рассматриваю возможность интеграции Neo4j в систему Clojure, которую я создаю. Первый вопрос, который мне задали, был, почему я не использовал Datomic. У кого-нибудь есть хороший ответ на это? Я слышал и видел видео о Datomic, но я недостаточно знаю о базах данных Graph, чтобы понять разницу между Neo4j и Datomic, и какая разница для меня?
Как Datomic сравнивается с Neo4j?
Ответы (1)
Между ними есть несколько принципиальных отличий:
Модель данных
И Neo4j, и Datomic могут моделировать произвольные отношения. Оба они эффективно используют схему EAV (entity-attribute-value), поэтому они оба могут моделировать многие из одних и тех же предметных областей, за исключением. Схема EAV Datomic также включает измерение времени (т.е. EAVT), что делает его очень мощный, если вы хотите выполнять эффективные запросы к вашей базе данных в произвольные моменты времени. Это то, что не неизменяемые хранилища данных (включая Neo4j) просто не могут сделать.
Доступ к данным
И Neo4j, и Datomic предоставляют API-интерфейсы обхода и языки запросов:
Запросы
Как Neo4j, так и Datomic предоставляют декларативные языки запросов (Cypher и Datalog соответственно), которые поддерживают рекурсивные запросы, за исключением Datomic's Datalog, который обеспечивает гораздо более совершенные возможности запросов, позволяя использовать настраиваемые функции фильтрации и агрегирования. реализован как произвольный код JVM. На практике это означает, что встроенные функции Cypher могут быть эффективно заменены библиотека последовательностей. Это возможно, потому что ваше приложение, а не база данных, выполняет запросы.
Обход
API-интерфейсы обхода всегда управляются кодом приложения, что означает, что и Neo4j, и Datomic могут проходить по графу, используя произвольный код обхода, фильтрации и преобразования данных, за исключением Neo4j, для которого требуется работающая транзакция. что на практике означает, что это ограничено по времени.
Согласованность данных
Другое фундаментальное отличие состоит в том, что Datomic-запросы не требуют координации с базой данных (т. е. транзакций чтения) и всегда работают с непротиворечивым моментальным снимком данных, что означает, что вы можете выполнять несколько запросов и преобразований данных в течение произвольный период времени и гарантировать, что ваши результаты всегда будут согласованными и что ни одна транзакция не будет истечена по тайм-ауту (потому что его нет). Опять же, это невозможно сделать в неизменяемых хранилищах данных, таких как подавляющее большинство существующих баз данных (включая Neo4j). Это также относится к их API обхода.
И Neo4j, и Datomic являются транзакционными (ACID) системами, но поскольку Neo4j использует традиционные интерактивные транзакции с оптимистичным управлением параллелизмом, запросы должны выполняться внутри транзакций (необходимо координировать), что налагает ограничения времени ожидания для ваших запросов. На практике это означает, что для очень сложных, длительных запросов вы в конечном итоге будете разделять свои запросы, чтобы они завершались в определенные сроки, отказываясь от согласованности данных.
Рабочий набор
Если по какой-то причине ваши запросы должны включать огромное количество данных (больше, чем обычно помещается в памяти), и вы не можете передавать результаты (поскольку Datomic предоставляет API-интерфейсы для потоковой передачи), Datomic, вероятно, не подойдет, поскольку вы не будет использовать преимущества архитектуры Datomic, заставляя одноранговые узлы постоянно изымать свою рабочую память, выполнять дополнительные сетевые вызовы и распаковывать сегменты данных.