Version 1.2.0 (October 28, 2026)
Full documentation can be found at https://docs.janusgraph.org/
<dependency>
<groupId>org.janusgraph</groupId>
<artifactId>janusgraph-core</artifactId>
<version>1.2.0</version>
</dependency>For more information on features and bug fixes in 1.2.0, see this GitHub milestone.
Upgrade instructions are provided in the changelog of the release: https://docs.janusgraph.org/master/changelog/#upgrade-instructions
Notable new features
- Upgrade to Apache TinkerPop 3.8.2 (breaking: TinkerPop 3.8 changes Gremlin semantics, see the upgrade instructions)
- Java 11 is now the minimum supported Java version (support for Java 8 is dropped); added support for Java 17, 21 and 25
- Support for Apache Cassandra 5.0. The pre-packaged distribution now bundles Cassandra 5.0.9
- CQL storage backend transitioned from the DataStax Java Driver to the Apache Cassandra Java Driver
- Support for Elasticsearch 9
- Support for OpenSearch 2 and 3 through the
elasticsearchindex backend - Support for Solr 9 (Solr 8 is deprecated) and upgrade to Apache Lucene 9
- Elasticsearch 6.0 is no longer supported (Elasticsearch 6.1 and newer still are)
- CDC-based mixed index synchronization: mixed indexes can be kept eventually consistent with the graph through Cassandra Change-Data-Capture and the new
janusgraph-cdcworker (opt-in) - New
WRITE_ONLY_ENABLEDindex state: reindex an index without enabling it, or stop using an enabled index for queries while it keeps receiving updates - New
REMOVE_STALE_ENTRIESschema action to remove the entries of deleted elements from composite and mixed indexes - Reindex a given subset of vertices instead of scanning the whole graph (CQL)
- Management APIs that decode vertex ids and composite index keys from their hex strings, for debugging
- Optional automatic closing of unreachable (zombie) instances during index status updates
- Recurring transaction recovery and failure statistics for transaction recovery
- Ordering by
LISTproperties through a mixed index textContainsPhrasesupport for Solr- Much faster mixed index reindex and OLAP scans: batched document restores, signal-based row hand-off between scan threads, opt-in parallel token-range scans, a scan-only page size and
PER PARTITION LIMITpushdown for CQL, and scan progress logging - Removing a vertex deletes its whole storage row in one operation, which drastically reduces tombstones when removing super-nodes on CQL
- Ordered traversals such as
g.V().order().by('name').limit(10)are answered by a mixed index which holds the order keys; orders which the index backend can't sort by are sorted by JanusGraph - Faster reads of large index results: Elasticsearch point-in-time paging (adaptive by default), scroll contexts only for results larger than a page, larger pages for limited results beyond 10,000 hits, and Solr results read in growing pages
- More resilient Elasticsearch backend: transient read and write failures are retried by default instead of failing the traversal or dropping the index mutation, missing documents are recreated whole, configurable connection pool (up to 30 connections to a single host) and lighter bulk requests
- The Gremlin pool of JanusGraph Server can run on virtual threads (Java 24 and newer)
- Core and storage performance improvements: relations without properties are parsed once, composite index lookups of several values read their index rows together, CQL reads more properties of a vertex per query and marks its write batches idempotent, ID blocks of different partitions are claimed in parallel, lock-free sampling of metrics
- A graph runs its background work on fewer, bounded threads which end when the graph closes
- BerkeleyJE now enforces
LOCKconsistency - Schema changes committed by ordinary transactions now reach the other JanusGraph instances
- Consistent query results whether an index backend or JanusGraph itself orders and filters the elements: strings are ordered and compared by code point and UUIDs by their string form; as in TinkerPop, ordered traversals leave out the elements without a value of the order key, and the
limit(),range()andorder()steps ofor()branches apply to each element; plus many fixes to decimal ranges, text predicates andSETkeys on Lucene, Solr and Elasticsearch
Tested Compatibility
- Apache Cassandra 3.11.10, 4.0.6, 5.0.8
- Apache HBase 2.6.0
- Oracle BerkeleyJE 7.5.11
- ScyllaDB 6.2.0
- Elasticsearch 6.6.0, 7.17.8, 8.15.3, 9.5.4
- OpenSearch 2.19.6, 3.9.0
- Apache Lucene 9.12.3
- Apache Solr 8.11.4, 9.10.1
- Apache TinkerPop 3.8.2
- Java 11, 17, 21, 25 (OLAP with Apache Spark: Java 11 and 17 only)
Installed versions in the Pre-Packaged Distribution
- Cassandra 5.0.9
- Elasticsearch 7.17.29
Contributors
$ git shortlog -sn v1.1.0..v1.2.0
141 Oleksandr Porunov
11 Balmukund Trivedi *
6 Natalia Tisseyre
3 Boxuan Li
3 Heyko Oelrichs *
3 dblugeon *
3 pm-osc
2 Ashish Jain *
2 Paul Lartigau *
1 Allan Clements
1 Henrique Lourenço *
1 Rian-Ismael *
1 Taewoon Kim *
1 Ying Xiao *
1 pedro_Simoes *
* denotes first-time contributor
// excluding dependabot and merging same authors' statistics