clojure - ¿Cómo se compara Datomic con Neo4j?
(1)
Hay algunas diferencias fundamentales entre ellos:
Modelo de datos
Tanto Neo4j como Datomic pueden modelar relaciones arbitrarias. Ambos usan, efectivamente, un esquema de EAV (valor de entidad-atributo-valor) para que ambos puedan modelar muchos de los mismos dominios problemáticos, excepto que el esquema EAV de Datomic también incorpora una dimensión de tiempo (es decir, EAVT) que lo hace muy poderoso si desea realizar consultas eficientes contra su base de datos en puntos arbitrarios en el tiempo . Esto es algo que las tiendas de datos no inmutables (incluido Neo4j) simplemente no pueden hacer.
Acceso a los datos
Tanto Neo4j como Datomic proporcionan API transversales y lenguajes de consulta:
Consultas
Tanto Neo4j como Datomic proporcionan lenguajes de consulta declarativos (Cypher y Datalog, respectivamente) que admiten consultas recursivas, excepto que el Datalog de Datomic proporciona capacidades de consulta muy superiores al permitir el filtrado personalizado y funciones agregadas para implementarse como código JVM arbitrario. En la práctica, esto significa que las funciones integradas de Cypher pueden ser reemplazadas efectivamente por la biblioteca de secuencias de Clojure. Esto es posible porque su aplicación, no la base de datos, es la que está ejecutando consultas.
Traversal
Las API de Traversal siempre están controladas por código de aplicación, lo que significa que tanto Neo4j como Datomic pueden recorrer un gráfico utilizando un cruce arbitrario, filtrado y código de transformación de datos, excepto que Neo4j requiere una transacción en ejecución que en la práctica significa que está limitada en el tiempo.
Consistencia de los datos
Otra diferencia fundamental es que las consultas Datomic no requieren coordinación de bases de datos (es decir, no hay transacciones de lectura) y siempre funcionan con una instantánea de datos coherente, lo que significa que puede realizar múltiples consultas y transformaciones de datos durante un período arbitrario y garantizar que sus resultados siempre ser constante y que ninguna transacción se agote (porque no hay ninguna). De nuevo, esto es imposible de hacer en almacenes de datos no inmutables como la gran mayoría de las bases de datos existentes (incluido Neo4j). Esto también se aplica a sus API transversales.
Tanto Neo4j como Datomic son sistemas transaccionales (ACID), pero debido a que Neo4j usa las transacciones interactivas tradicionales -utilizando controles de concurrencia optimistas-, las consultas deben ocurrir dentro de las transacciones (necesitan ser coordinadas) lo que impone restricciones de tiempo de espera a sus consultas. En la práctica, esto significa que para consultas muy complejas y de larga ejecución, terminará dividiendo sus consultas, por lo que terminan dentro de ciertos límites de tiempo, renunciando a la coherencia de los datos.
Set de trabajo
Si por alguna razón tus consultas tuvieran que involucrar una gran cantidad de datos (más de lo que normalmente cabría en la memoria) y no pudieras transmitir los resultados (ya que Datomic proporciona API de transmisión), Datomic probablemente no sería una buena opción ya que no aprovecharía la arquitectura de Datomic, lo que obligaría a los compañeros a desalojar constantemente su memoria de trabajo, realizar llamadas de red adicionales y descomprimir segmentos de datos.
Estoy buscando integrar Neo4j en un sistema Clojure que estoy construyendo. La primera pregunta que me hicieron fue por qué no usé Datomic. ¿Alguien tiene una buena respuesta para esto? He escuchado y visto videos en Datomic, pero no sé lo suficiente sobre las bases de datos de gráficos para saber la diferencia entre Neo4j y Datomic, y ¿qué diferencia me haría?