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

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


person yazz.com    schedule 27.07.2013    source источник


Ответы (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, заставляя одноранговые узлы постоянно изымать свою рабочую память, выполнять дополнительные сетевые вызовы и распаковывать сегменты данных.

person a2ndrade    schedule 27.07.2013
comment
Очень хорошо продуманное описание, спасибо. Вы использовали оба продукта? - person yazz.com; 27.07.2013
comment
@Zubair Я использовал Datomic. Я знаком с Neo4j. В качестве примечания посмотрите на github.com/datablend/blueprints, который представляет собой набор графиков интерфейсы, обычно реализуемые графовыми базами данных для демонстрации некоторых их возможностей. Существуют реализации Neo4j и Datomic (хотя реализация Datomic использует Java, а не Clojure, поэтому некоторые вещи не идиоматичны). - person a2ndrade; 27.07.2013
comment
Просто комментарий к вашему описанию: пользовательские функции фильтрации и агрегирования также могут быть реализованы с помощью Neo4J. Cypher – не единственный способ запроса данных (особенно в мире JVM), структура обхода позволяет вам писать любой код для извлечения данных, и вы всегда можете вернуться к более низкоуровневым API для добиться еще более мелкозернистого поиска. - person fbiville; 28.07.2013
comment
А насчет непротиворечивости данных вы абсолютно правы. Это фундаментальное различие очень хорошо показано в этом выступлении Рича Хики: .com/presentations/Are-We-There-Yet-Rich-Hickey. - person fbiville; 28.07.2013
comment
@Rolf Я хотел сказать, что журнал данных Datomic намного превосходит Cypher (из-за пользовательских функций) и что оба предлагают API обхода. Я понял, что это было плохо написано, поэтому я обновил его, спасибо. Вы правы в том, что вы можете использовать произвольный код с API обхода, но это потому, что обход всегда управляется кодом приложения, которое всегда выполняется локально. Вероятно, это верно для любой другой графовой базы данных. Опять же, я понял, что это было плохо написано, поэтому я тоже обновил его. Спасибо. - person a2ndrade; 28.07.2013
comment
Хорошо, я, вероятно, неправильно понял то, что я впервые прочитал ;) Однако имейте в виду, что Cypher, хотя и развивается довольно быстро, все еще очень молодой язык. - person fbiville; 28.07.2013
comment
Это очень хорошо продуманный ответ, но для полноты картины я хотел бы, чтобы кто-то с большим опытом работы с Neo4j взвесился. Принятый ответ кажется смещенным в сторону Datomic. - person Ben; 09.08.2015
comment
Актуально ли это сегодня (спустя 5 лет)? - person Piyush Katariya; 19.05.2018
comment
К вашему сведению, datomic недавно добавил API qseq, который облегчает работу с большими рабочими наборами - person Erich Oliphant; 19.07.2020