Skip to content

Download

Select the distribution that suits you to evaluate Quine from the list below, then get started building a streaming graph solution with Quine.

Distribution Requires Launch Quine
Docker File Docker or Docker Desktop docker run -p 8080:8080 thatdot/quine
Executable Java JRE 11 or newer java -jar quine-1.5.7.jar
Source Code Java 11 or new JDK, sbt, node, and yarn sbt quine/run
  • Pre-compiled JAR file


    No need to set up a full Scala development environment to run Quine if you already have a Java Runtime Environment (JRE) set up.

       Download JAR file

  • Docker Container


    If you prefer to keep your initial evaluation in a container, we have one already set up for you and ready to go!

      Pull Docker container

  • GitHub Repository


    Quine is written in Scala and released as open source. Build Quine from source in your own environment.

       Clone from GitHub


Release 1.5.7

Enhancements:

  • SSL is now supported when interacting with Quine in an untrusted environment by using the SSL_KEYSTORE_PATH and SSL_KEYSTORE_PASSWORD environment variables
  • Add create.setProperty procedure to allow setting a property with a dynamic key, dual to accessing a property with square-bracket syntax
  • Additional performance metrics can be added with enableDebugMetrics setting to help diagnose internal messaging and node load/unload throughput

Bugfixes:

  • Multiple Value Standing Query (MVSQ) will now properly trigger a change when a property is set/unset to null

Updates:

  • stoplight elements to v7.12.0
  • snakeyaml-engine to 2.7
  • logback-classic to 1.4.11
  • sts to 2.20.139
  • cats-core to 2.10.0
  • circe-core, circe-parser, ... to 0.14.6
  • msgpack-core to 0.9.5
  • scalajs-dom to 2.6.0
  • guava to 32.1.2-jre

Release 1.5.6

Enhancements

  • Added support for STS assumed-role authentication to experimental AWS Keyspaces persistor

Bugfixes

  • Removed "total memory" gauge from metrics dashboard when maximum total memory can't be calculated based on the running JVM
  • Fixed a "stream stopped before async invocation was processed" error message that could occur when resuming ingests on startup

Updates

  • webjars-locator to 0.47
  • sbt-jmh to 0.4.5
  • guava to 32.0.1-jre
  • dropwizard metrics to 4.2.19
  • logback-classic to 1.4.8
  • scala-library to 2.12.18
  • cats-effect to 3.5.1
  • scala-collection-compat to 2.11.0

Release 1.5.5

Enhancemnts

  • Ingest status is now preserved across restarts when restore-ingest configuration is set
  • Improved error handling within Keyspaces persistor

Bugfixes

  • Valid Kafka configurations (e.g., ssl.truststore.location) are now accepted by the KafkaIngest stream configuration object
  • Remove unnecessary log line

Updates

  • bootstrap to 5.3.0
  • flatbuffers-java to 23.5.26
  • sttp-client to 5.4.0
  • pureconfig to 0.17.4
  • commons-io to 2.12.0
  • guava to 32.0.0-jre
  • scalatest to 3.2.16
  • sbt to 1.8.3

Release 1.5.4

Temporal types have had a spring cleaning! Time values created in Quine 1.5.3 and earlier (without timezones) are automatically converted to LocalTime values in Quine 1.5.4. No user action is required.

Enhancements

  • Added support for localtime function and values to the Quine graph and Cypher
  • Updated documentation for Kinesis ingest to reflect the new name "Kinesis Data Streams"
  • Technical preview for AWS Keyspaces persistor
  • Improved configuration linting and error reporting for Kafka ingest
  • Added support for purgeNode procedure to RocksDB and MapDB persistors
  • Added automatic recovery (up to 3 attempts) of ingests that fail to start/restart due to upstream issues
  • Simplified reify.time-generated nodes to use static labels for easier styling
  • Improved documentation for administrative APIs
  • Added scheduler checkpoint settings maxBatchSize and maxBatchWait to Kinesis Data Streams ingest

Bugfixes

  • Resuming a failed ingest now reports an HTTP error instead of timing out
  • Time values in the Quine graph now correctly store and use offsets from UTC
  • The date function now always correctly returns a date instead of a datetime.
  • Errors that occur while submitting an invalid standing query are now reported as "Bad Request"

Updates

  • Base docker image to JVM 20
  • sbt-scalajs-crossproject to 1.3.1
  • scalajs to 1.13.1
  • circe to 0.14.5
  • pureconfig to 0.17.3
  • endpoints4s to 3.8.15
  • logback-classic to 1.4.7
  • scala-collection-compat to 2.10.0

Release 1.5.3

Enhancements

  • A distinct "advertised"/canonical HTTP address used for self-referencing links may be set via quine.webserver-advertise
  • Added purgeNode procedure, which may be used to permanently delete a node and all data owned by that node (including historical) from Quine, including the persistence layer

Bugfixes

  • Error message from Cypher compilation failures involving int.add now report the correct types
  • Several typos throughout the codebase have been corrected, contributed by @stavares843
  • Slack notifications from Standing Queries now render with the intended rich formatting
  • API documentation for DebugOps now correctly renders the usage disclaimer for those APIs

Updates

  • logback-classic to 1.4.6
  • akka-http-backend, slf4j-backend to 3.8.14
  • dropwizard metrics to 4.2.17
  • circe-config to 0.10.0
  • memeid4s to 0.8.0
  • proto-google-common-protos to 2.14.2
  • sbt-assembly to 2.1.1
  • flatbuffers-java to 23.3.3
  • rocksdbjni to 7.10.2

Release 1.5.2

Enhancements

  • Added first-class support to the Quine engine and the Cypher interpreter for new temporal types: Date, Time, LocalDateTime, and Duration
  • Added int.add() (replacing incrementCounter), float.add(), set.insert(), and set.union() procedures for atomically updating properties of different types
  • Added castOrNull() and castOrThrow() Cypher functions for providing type hints to the query compiler for values
  • Replaced remaining uses of ujson with circe JSON for better support of 64-bit integers
  • Replaced LiteralOps API with a new DebugOps API, focusing on presenting human-readable versions of node state
  • Removed auto-commit option from Kafka ingest API: To continue using autocommit, pass "autoCommitIntervalMs": 5000 in the kafkaProperties option instead

Bugfixes

  • Complex strId()-based queries are now executable without an all-node scan (contributed by @harpocrates)
  • MERGE queries now correctly combine the scopes of their CREATE and MATCH possibilities (contributed by @harpocrates)
  • Log messages from IngestRoutes no longer report as being logged by a different class (e.g., "QuineApp")

Updates

  • flatbuffers-java to 23.1.21
  • jquery to 3.6.3
  • kafka-clients to 3.3.2
  • proguard-base to 7.3.1
  • pulsar4s-akka-streams to 2.9.0
  • rocksdbjni to 7.9.2
  • sbt-jmh to 0.4.4
  • scalajs-compiler to 1.13.0

Release 1.5.1

Enhancements

  • Switched JSON parser from ujson to circe to avoid loss of precision in large integers in standing queries (Further support for large integers coming soon)
  • REST API documentation style and readability updates
  • Added documentation for graph AI use cases
  • Improved performance of Cassandra persistor by reducing load and latency during ingest

Bugfixes

  • Reduced log noise when performing more than 2 operations on a node as part of a single message

Release 1.5.0

Enhancements

  • Many API endpoints now support YAML request bodies: Convenient for copying pipelines from recipes to a Quine server!
  • AWS client configurations (SNS, Kinesis, etc) separated "region" from "credentials"
  • Added "Graph Algorithms" category to the REST API
  • Added random walk graph algorithm (compatible with Node2Vec and GraphSAGE walk generation), REST endpoint, and Cypher procedure
  • Administration REST API documentation style and readability updates
  • Non-historical nodes can now be kept awake for a minimum duration after each message
  • Kafka ingests may now include a settings block for the Kafka client, e.g., to specify credentials. Contributed by @charliemenke
  • No longer require all fields to be specified in recipes, improving readability
  • Performance improvements in MapDB, Cassandra, DistinctId standing queries
  • Improve indexing of node edge collections for increased query performance

Bugfixes

  • Switched JSON parser from ujson to circe to avoid loss of precision in large integers in ingest streams (Further support for large integers coming soon)
  • Resolved issues with clean shutdown of the Quine application via the API

Release 1.4.2

Enhancements

  • Added canonicalized mapping of QuineIds and DGBs to reduce heap usage
  • Simplified node wakeup protocol
  • Improved contributor experience when building with node version greater than 16
  • Now support amd64 and arm64 architectures for Quine docker image

Bugfixes

  • Node debug endpoint / procedure now includes all DistinctId localEventIndex entries instead of just one

Release 1.4.1

Bugfix

  • Edge case where Akka complains of an actor name being re-used too quickly is now retried.

Release 1.4.0

Enhancements

  • The reify.time procedure now yields only the finest-granularity reified period node for better query ergonomics
  • Removed nullary and unary locIdFrom variants to simplify locIdFrom usage
  • Enriched logging in edge cases involving shard resolution
  • Restructured ingest streams for better consistency and handling of edge-cases involving charset transcoding
  • Optimized storage of DateTime to use less space
  • Simplified node wakeup protocol: edge cases involving simultaneous request to sleep and wake should now be more efficient
  • Improved API documentation of ingest streams
  • Add notification preview text for rich Slack messages used as Standing Query outputs
  • Provide a warning when a full-node scan is detected in ingest query
  • Added text.urlencode and text.urldecode Cypher functions
  • Added atomic "count" return value to incrementCounter procedure
  • Added support for decoding steps during ingest (base64, zlib, and gzip)
  • Standing Queries can now use idFrom-based ID constraints, provided that all arguments to the idFrom are literal values
  • Rewrote the serialization, persistence, and message passing system used by DistinctId Standing Queries
  • Change default order of node effects to "persister first", applying in-memory effects only after the persistence operation succeeds
  • Removed unused / experimental "node merging" behavior

Bugfixes

  • Cassandra persister batched writes now respect configured timeout and consistency options
  • Long-typed QuineIdProviders will now interoperate correctly with the getHost procedure
  • singleton-snapshot and journals may now be enabled at the same time
  • Added a heuristic rate limiter to Kinesis ingest streams to improve stability when Quine reads faster than Kinesis can emit
  • Improved cluster stability when cluster members experience temporary disconnections
  • Improved shutdown behavior in failsafe case
  • UUIDv5 and UUIDv3 id providers now generate correctly bit-masked identifiers
  • MultipleValues standing queries are now properly restored on nodes where shutdown is started and then cancelled
  • Node edge and property counts will now be correctly reflected in the metrics dashboard
  • Improved use case for reify time to ensure reified time nodes have all properties set

Updates

  • Replaced snakeyaml with snakeyaml-engine, supporting YAML 1.2
  • akka to 2.6.20 (contributed by @He-Pin)
  • bootstrap to 5.2.2
  • cassandra client to 4.15.0
  • endpoints4s to 1.8.0
  • endpoints4s (akka-http) to 7.0.0
  • endpoints4s (openApi) to 4.2.0
  • endpoints4s (xhr) to 5.1.0
  • jquery to 3.6.1
  • netty-nio-client to 2.17.288
  • parboiled to 1.4.1
  • scalajs to 1.11.0
  • rocksdb to 7.6.0
  • scalajs-dom to 2.3.0
  • flatbuffers-java to 22.10.26
  • dropwizard metrics to 4.2.12
  • logback to 1.4.4
  • apache commons to 1.10.0
  • protobuf-java to 3.21.8
  • Novelty: graal to 22.2.0
  • Memeid4s to 0.7.0

Release 1.3.2

Release Quine 1.3.2

Enhancements

  • Improved logging of error and startup messages

Bugfixes

  • RocksDB unit tests will now clean up files they make (contributed by @dennylee)
  • text.utf8Decode now accepts a 1-argument invocation

Updates

  • sbt to 1.7.1
  • scala-collection-compat to 2.8.1
  • scalatest to 3.2.13

Release 1.3.1

Enhancements

  • Added support for QUINE_DATA environment variable, which can be set to define the default persistence path.
  • Improved consistency of prose in WARN and INFO log messages
  • Improved Cypher query execution time

Bugfixes

  • Fixed an issue where messages output while running a recipe could be duplicated

Updates

  • classgraph to 4.8.149
  • sbt to 1.7.0
  • scala-collection-compat to 2.8.0
  • scala-js-macrotask-executor to 1.1.0
  • scopt to 4.1.0
  • memeid4s to 0.6.0
  • msgpack-core to 0.9.3

Release 1.3.0

Features

  • Added a pagination (SKIP/LIMIT) optimizer to the Cypher query engine for historical queries with no unaliased values
  • Enabled journals by default when running a recipe
  • Added support for using the Stoplight Elements interactive documentation behind an authentication proxy

Bugfixes

  • Fixed an issue where waking up a node would not correctly re-register its standing queries, potentially resulting in dropped results
  • Fixed an issue where Cypher subqueries could be executed with too many variables in scope
  • Fixed an issue where some Cypher constructs (notably: variable-length relationship patterns) could be executed with too many variables in scope
  • Fixed a documentation rendering issue for Standing Query Outputs
  • Renamed the metric "persistors.snapshot-sizes" to "persistor.snapshot-sizes" for consistency
  • Fixed the behavior of DISTINCT during Cypher query execution, making it work correctly with SKIP and/or LIMIT

Misc

  • Simplified startup log messages
  • Update some error messages to use the correct name for DistinctId Standing Queries
  • Improved UX for API-issued historical queries near the present time
  • Removed logback-config logging library: to configure logging, use standard logback.xml
  • Added timestamps to node journal events in debug.node and node debug APIs
  • Removed StandingQueryPattern.Graph API
  • Improved distribution of randomly-generated partitioned IDs
  • Documented metrics endpoint in openapi specification
  • Added peephole optimization for property value comparsion
  • Refactored to simplify DomainGraphBranch representation

Updates

  • rocksdbjni to 7.3.1
  • msgpack-core to 0.9.2
  • cats-core to 2.8.0
  • metrics to 4.2.10
  • scala-library to 2.12.16
  • sbt-paradox to 0.10.2
  • sbt-scalafix to 0.10.1
  • scala-java-time to 2.4.0

Release 1.2.1

Features

  • Added debug.sleep Cypher procedure to request a node sleep
  • Replaced swagger-ui REST API viewer with Stoplight Elements
  • Integrated recipe-like command-line arguments with main configuration, allowing command-line arguments when running the main Quine application and reflecting those settings in the config REST API

Bugfixes

  • Fixed a bug where some node journal events were not deduplicated, improving throughput and reducing disk usage
  • Fixed a minor typo in command-line argument parsing
  • VOID procedures called as the last clause in a Cypher query now return 0 rows instead of 1 empty row

Misc

  • Switched to target JRE 11 during compilation, allowing more runtime optimizations
  • Made process ID lookup more reliable cross-platform

Updates

  • rocksdbjni to 7.2.2

Release 1.2.0

This release brings several API improvements, new Cypher query features, and persistence backend bugfixes and optimizations to better support supernodes and other extreme-scale datasets. Some of these changes affect the data format on disk, and accordingly data from prior versions (<= 1.1.2) can not be used with Quine 1.2.0 without migration. Furthermore, this release increases the minimum supported Java version to 11.

Features

  • Add reify.time, a Cypher procedure to generate a uniform structured representation of timestamp data within the graph, to make time-related data analysis via Standing Queries easier and more consistent
  • Add a REST API endpoint to request a specific node save a snapshot and go to sleep
  • Added support for Cypher subqueries via the CALL {} syntax
  • EXPLAINed query ASTs will now be logged at debug level, if enabled
  • Improved serialization for nodes with an extremely large edge and/or property counts in the persistence backend
  • Nodes with an extremely large edge and/or property count can now be correctly accessed via the Literal Operations REST APIs
  • Iteration and sort order of Map-type values in Cypher queries are handled consistently
  • Add a configuration option for writing updates to disk before applying effects in-memory: quine.persistence.effect-order
  • Add a startup check to verify that Cassandra's configuration matches the provided Quine configuration, warning if there is a mismatch
  • Calling the debug API on a node in a historical query now only includes journal events up to the time of the historical query

Bugfixes

  • Application start up can no longer log an opaque warning like "Current state = CODING, previous state = FLUSHED"
  • Setting snapshot-singleton=true, snapshot-schedule=on-node-update, and journal-enabled=false no longer causes the most recent event on a node to be dropped
  • Map-type values in Cypher hash to a consistent value, independent of how they were constructed
  • Accessing nodes just as they fall out of the cache can no longer cause the system to enter a failsafe mode
  • Historical queries that restore journals with noncommutative effects after a snapshot from Cassandra apply updates in order
  • Fix an issue with RocksDB where some Standing Query states weren’t restored
  • Added a minimum header width to recipe status query output
  • Fix an issue where standing queries were not properly restored on startup

Misc

  • Remove support for DistinctId queries that do not specify a DISTINCT keyword
  • Remove support for toInt in Cypher queries (use toInteger instead)
  • Remove support for filter and extract in Cypher queries (use list comprehensions instead)
  • ID values returned via the exploration UI are now pretty-printed
  • Use Cypher for query UI edge queries for better performance and fewer timeouts when querying supernodes
  • Make recipes and example queries more consistent in styling
  • Make use of datetime() in Apache log recipe to parse timestamps
  • When the system clock moves backwards, Quine handles the issue transparently. Change the log level for this occasion from warn to info.
  • Rename executionGuarantee parameter on the CypherQuery Standing Query Output to shouldRetry, and set the default to true
  • Increase resilience of persistence operations in deployments with unreliable persistors
  • Improve performance of historical queries involving nodes with many edges
  • Add persistor exceptions, including timeouts, to the list of exception types that are retried for ingest queries and when shouldRetry = true
  • Rename Cassandra store options insert-time and select-timeout to write-timeout and read-timeout, respectively

Updates

  • akka-http, akka-http-xml to 10.2.9
  • protobuf-java to 3.20.0
  • rocksdbjni to 7.0.3
  • ujson, upickle to 1.6.0
  • shapeless to 2.3.9
  • memeid4s to 0.5.0
  • scalajs to 1.10.0
  • scalatest to 3.2.12
  • scalacheck to 1.16.0
  • sbt-scalafix to 0.10.0
  • classgraph to 4.8.146

Release 1.1.2

Features

  • Add support for additional Cypher aggregation functions: stDev, stDevP, percentileCont, and percentileDisc (#1629)
  • Add an option to retry CypherQuery type Standing Query outputs (#1642)
  • Add support for RocksDB on M1 Macs (#1659)
  • Add a metric for "shared.valve.ingest" the "gauges" section of the GET /api/v1/admin/metrics API endpoint to report the backpressured status of ingest streams (#1653)
  • Report all recipe substitution errors at once (#1650)

Bugfixes

  • Remove references to an endpoint that no longer exists (#1619)
  • Retry loading application state in case of persistor failure (#1631)
  • Print live-updating status messages for Recipes in a consistent order (#1609)
  • Remove a duplicate copy of labels in certain queries for nodes (#1636)
  • Enable ingest to recover from temporary failures (eg as caused by a flaky network) (#1627)

Misc

  • Rename "importers" package to "ingest" (#1621)
  • Remove unused fields from build info API endpoint (#1554)
  • Add additional context to some log messages (#1639)
  • Log a warning when a node approaches becoming a supernode (#1641)
  • Improve performance of some API endpoints (#1612)
  • Update Akka version to 2.6.19 (#1656)

Release 1.1.0

Features

  • Add Websockets ingest adapter
  • Add stdin ingest adapter
  • Add pretty-printing of Status Query results to Recipe interpreter
  • Add a "Run again as text query" link to the Query UI
  • Add a static check to the Cypher query planner to identify queries which cannot fail

Bugfixes

  • Fix a race condition in the REST API which could cause multiple simultaneous API calls to report incorrect status, even when the system behaves correctly
  • Fix cross-application config loading and re-add clustering config to Quine Enterprise
  • Add extra checks to ensure failure to wake up a node does not leave the system in an inconsistent state
  • Fixed a Cypher bug involving spurious errors during UDF compilation

Misc

  • Added OSS CI
  • Fix 2.13 build for projects with 2.13 cross build
  • Fix a typo
  • Dependency updates: webjars-locator to 0.45; slinky to 0.7.2; classgraph to 4.8.141; akka-http, akka-http-xml to 10.2.8; scalajs to 1.9.0; sbt-buildinfo to 0.11.0; sbt-assembly to 1.2.0; proguard-base to 7.2.1

Release 1.0.0

Initial release https://quine.io