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.
-
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!
-
GitHub Repository
Quine is written in Scala and released as open source. Build Quine from source in your own environment.
Release 1.5.7¶
Enhancements:¶
- SSL is now supported when interacting with Quine in an untrusted environment by using the
SSL_KEYSTORE_PATH
andSSL_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
andmaxBatchWait
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
, andDuration
- Added
int.add()
(replacing incrementCounter),float.add()
,set.insert()
, andset.union()
procedures for atomically updating properties of different types - Added
castOrNull()
andcastOrThrow()
Cypher functions for providing type hints to the query compiler for values - Replaced remaining uses of
ujson
withcirce
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 theirCREATE
andMATCH
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
tocirce
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
tocirce
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
andunary
locIdFrom
variants to simplifylocIdFrom
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
andtext.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
withsnakeyaml-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 (usetoInteger
instead) - Remove support for
filter
andextract
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
toinfo
. - Rename
executionGuarantee
parameter on the CypherQuery Standing Query Output toshouldRetry
, 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