Подтвердить что ты не робот

Как Datomic сравнить с Neo4j?

Я рассматриваю интеграцию Neo4j в систему Clojure, которую я создаю. Первый вопрос, который меня задали, - это то, почему я не использовал Datomic. У кого-нибудь есть хороший ответ на это? Я слышал и видел видео на Datomic, но я не знаю достаточно о базах данных Graph, чтобы узнать разницу между Neo4j и Datomic и какая разница для меня?

4b9b3361

Ответ 1

Существует несколько принципиальных различий между ними:

Модель данных

Оба Neo4j и Datomic могут моделировать произвольные отношения. Они оба эффективно используют схему EAV (сущность-атрибут-значение), поэтому они могут моделировать многие из тех же проблемных доменов кроме Схема Datomic EAV также включает в себя временную разницу (т.е. EAVT), которая делает это очень мощный, если вы хотите выполнять эффективные запросы к вашей базе данных в произвольные моменты времени. Это то, что не-неизменяемые хранилища данных (включая Neo4j) можно просто не делать.

Доступ к данным

Оба Neo4j и Datomic предоставляют API обхода и языки запросов:

Запросы

Оба Neo4j и Datomic предоставляют декларативные языки запросов (Cypher и Datalog соответственно), которые поддерживают рекурсивные запросы кроме Datomic Datalog предоставляет гораздо более широкие возможности запросов, позволяя настраивать функции фильтрации и агрегации > для реализации как произвольный JVM-код. На практике это означает встроенные функции Cypher, которые могут быть заменены библиотекой последовательностей Clojure . Это возможно, потому что ваше приложение, а не база данных, - это одна из выполняемых запросов.

Traversal

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

Последовательность данных

Другим фундаментальным отличием является то, что Datomic-запросы не требуют координации базы данных (т.е. транзакций без чтения), и они всегда работают с согласованным снимком данных, что означает, что вы можете выполнять несколько запросов и преобразований данных в течение произвольного периода времени и гарантировать, что ваши результаты всегда будут согласованы и что никакая транзакция не будет таймаутом (потому что там нет). Опять же, это невозможно сделать в неизменяемых хранилищах данных, таких как подавляющее большинство существующих баз данных (включая Neo4j). Этот также применяется к их API обхода.

Оба Neo4j и Datomic являются транзакционными (ACID) системами, но поскольку Neo4j использует традиционные интерактивные транзакции, используя оптимистичные элементы управления concurrency, запросы должны выполняться внутри транзакций (необходимо координировать), которые накладывают ограничения времени на ваши запросы. На практике это означает, что для очень сложных долгосрочных запросов вы закончите разделение своих запросов, чтобы они закончили в определенные сроки, отказавшись от согласованности данных.

Рабочий набор

Если по какой-то причине ваши запросы должны были включать огромный объем данных (больше, чем обычно вписывались в память), и вы не могли бы потопить результаты (поскольку Datomic предоставляет потоковые API), Datomic, вероятно, не будет хорошим так как вы не будете использовать преимущества Datomic architecture, заставляя сверстников постоянно вытеснять рабочую память, выполнять дополнительные сетевые вызовы и декомпрессировать сегменты данных.