This is an automated email from the ASF dual-hosted git repository.
Cole-Greer pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/master by this push:
new cc85a50349 CTR Docs fixes for 4.0.0-beta.3:
cc85a50349 is described below
commit cc85a50349a042cb262ecab57763d75846081987
Author: Cole Greer <[email protected]>
AuthorDate: Wed Jul 15 18:51:08 2026 -0700
CTR Docs fixes for 4.0.0-beta.3:
Update upgrade docs for 4.0.0-beta.3 release
fix docs processing
add missing GLVs to Basic Gremlin docs
---
docs/src/reference/intro.asciidoc | 30 +++
docs/src/upgrade/release-4.x.x.asciidoc | 217 +++++++++------------
.../gremlin/docs/GremlinTreeprocessor.java | 0
.../gremlin/docs/GremlinTreeprocessorTest.java | 2 +-
4 files changed, 126 insertions(+), 123 deletions(-)
diff --git a/docs/src/reference/intro.asciidoc
b/docs/src/reference/intro.asciidoc
index 6490b4b4d8..636faff8c2 100644
--- a/docs/src/reference/intro.asciidoc
+++ b/docs/src/reference/intro.asciidoc
@@ -481,18 +481,34 @@ v1 = g.addV('person').property('name','marko').next()
v2 = g.addV('person').property('name','stephen').next()
g.V(v1).addE('knows').to(v2).property('weight',0.75).iterate()
----
+[source,csharp]
+----
+include::../../../gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Docs/Reference/IntroTests.cs[tags=basicGremlinAdds]
+----
[source,java]
----
Vertex v1 = g.addV("person").property("name","marko").next();
Vertex v2 = g.addV("person").property("name","stephen").next();
g.V(v1).addE("knows").to(v2).property("weight",0.75).iterate();
----
+[source,javascript]
+----
+const v1 = g.addV('person').property('name','marko').next();
+const v2 = g.addV('person').property('name','stephen').next();
+g.V(v1).addE('knows').to(v2).property('weight',0.75).iterate();
+----
[source,python]
----
v1 = g.addV('person').property('name','marko').next()
v2 = g.addV('person').property('name','stephen').next()
g.V(v1).addE('knows').to(v2).property('weight',0.75).iterate()
----
+[source,go]
+----
+v1, err := g.AddV("person").Property("name", "marko").Next()
+v2, err := g.AddV("person").Property("name", "stephen").Next()
+g.V(v1).AddE("knows").To(v2).Property("weight", 0.75).Iterate()
+----
The first two lines add a vertex each with the vertex label of "person" and
the associated "name" property. The third
line adds an edge with the "knows" label between them and an associated
"weight" property. Note the use of `next()`
@@ -510,16 +526,30 @@ Retrieving this data is also a just writing a Gremlin
statement:
marko = g.V().has('person','name','marko').next()
peopleMarkoKnows = g.V().has('person','name','marko').out('knows').toList()
----
+[source,csharp]
+----
+include::../../../gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Docs/Reference/IntroTests.cs[tags=basicGremlinMarkoKnows]
+----
[source,java]
----
Vertex marko = g.V().has("person","name","marko").next()
List<Vertex> peopleMarkoKnows =
g.V().has("person","name","marko").out("knows").toList()
----
+[source,javascript]
+----
+const marko = g.V().has('person','name','marko').next()
+const peopleMarkoKnows =
g.V().has('person','name','marko').out('knows').toList()
+----
[source,python]
----
marko = g.V().has('person','name','marko').next()
peopleMarkoKnows = g.V().has('person','name','marko').out('knows').toList()
----
+[source,go]
+----
+marko, err := g.V().Has("person", "name", "marko").Next()
+peopleMarkoKnows, err := g.V().Has("person", "name",
"marko").Out("knows").ToList()
+----
In all these examples presented so far there really isn't a lot of difference
in how the Gremlin itself looks. There
are a few language syntax specific odds and ends, but for the most part
Gremlin looks like Gremlin in all of the
diff --git a/docs/src/upgrade/release-4.x.x.asciidoc
b/docs/src/upgrade/release-4.x.x.asciidoc
index 60be32de2e..11c89536fc 100644
--- a/docs/src/upgrade/release-4.x.x.asciidoc
+++ b/docs/src/upgrade/release-4.x.x.asciidoc
@@ -23,11 +23,11 @@ image::gremlins-wildest-dreams.png[width=185]
*Gremlin's Wildest Dreams*
-== TinkerPop 4.0.0
+== TinkerPop 4.0.0-beta.3
*Release Date: NOT OFFICIALLY RELEASED YET*
-Please see the
link:https://github.com/apache/tinkerpop/blob/4.0.0/CHANGELOG.asciidoc#release-4-0-0[changelog]
for a
+Please see the
link:https://github.com/apache/tinkerpop/blob/4.0.0-beta.3/CHANGELOG.asciidoc#release-4-0-0-beta-3[changelog]
for a
complete list of all the modifications that are part of this release.
=== Upgrading for Users
@@ -69,7 +69,7 @@ See:
link:https://issues.apache.org/jira/browse/TINKERPOP-3262[TINKERPOP-3262]
TinkerPop 4.x standardizes connection option names and defaults across all
five Gremlin Language Variants (Java, Python,
.NET, Go, and JavaScript). Each driver using its language-idiomatic casing
(`camelCase`, `PascalCase`, or `snake_case`).
-Renames are breaking: the old option names have been removed (no deprecated
aliases), so existing code must be updated.
+These renames are breaking, the old option names have been removed.
NOTE: Timeouts use a millisecond-suffixed canonical name
(`connectTimeoutMillis`, `readTimeoutMillis`,
`idleTimeoutMillis`, `keepAliveTimeMillis`, and the `_millis` form in Python).
Java, Go, .NET, and Python also accept an
@@ -114,46 +114,32 @@ These change runtime behavior on upgrade even if you do
not change your configur
===== Driver-specific notes
-- *Java* (`gremlin-driver`): renamed
`maxConnectionPoolSize`->`maxConnections`,
`connectionSetupTimeoutMillis`->`connectTimeoutMillis`,
+- *Java* (`gremlin-driver`): Renamed:
`maxConnectionPoolSize`->`maxConnections`,
`connectionSetupTimeoutMillis`->`connectTimeoutMillis`,
`idleConnectionTimeoutMillis`->`idleTimeoutMillis`,
`resultIterationBatchSize`->`batchSize`, `serializer`->`responseSerializer`,
- and `RequestOptions` `addG`->`traversalSource`; old names are removed. New:
`readTimeoutMillis`, `keepAliveTimeMillis`,
- `maxResponseHeaderBytes`, `proxy(ProxyOptions)`, `url(String)`,
`ssl(SslContext)`. Removed `maxResponseContentLength`.
+ and `RequestOptions` `addG`->`traversalSource`. New: `readTimeoutMillis`,
`keepAliveTimeMillis`,
+ `maxResponseHeaderBytes`, `proxy(ProxyOptions)`, `url(String)`,
`ssl(SslContext)`. Removed: `maxResponseContentLength`.
`validationRequest` default reconciled to `g.inject(0)`.
-- *Python* (`gremlin-python`): renamed `pool_size`->`max_connections` (default
8->128) and `ssl_options`->`ssl` (old names removed).
+- *Python* (`gremlin-python`): Renamed: `pool_size`->`max_connections`
(default 8->128) and `ssl_options`->`ssl`.
New: `connect_timeout_millis`, `read_timeout_millis`, `idle_timeout_millis`,
`keep_alive_time_millis`, `compression`,
- `batch_size`, `proxy`, `trust_env`. `auth.sigv4` gained an optional
credentials provider. Removed `headers` (use interceptors)
- and `max_content_length`. Requires `aiohttp>=3.11`.
-- *.NET* (`gremlin-dotnet`): renamed
`MaxConnectionsPerServer`->`MaxConnections`,
`ConnectionTimeout`->`ConnectTimeout`,
+ `batch_size`, `proxy`, `trust_env`. `auth.sigv4` gained an optional
credentials provider. Removed: `headers` (use interceptors)
+ and `max_content_length`.
+- *.NET* (`gremlin-dotnet`): Renamed:
`MaxConnectionsPerServer`->`MaxConnections`,
`ConnectionTimeout`->`ConnectTimeout`,
`IdleConnectionTimeout`->`IdleTimeout`,
`KeepAliveInterval`->`KeepAliveTime`, `EnableCompression`->`Compression`, and
- `Auth.BasicAuth`/`Auth.SigV4Auth`->`Auth.Basic`/`Auth.Sigv4`; old names
removed. New: `ReadTimeout`, `MaxResponseHeaderBytes`,
- `Proxy`, `Ssl`, `BulkResults`. `KeepAliveTime` now drives a real TCP
keep-alive socket option instead of the inert HTTP/2 ping.
-- *Go* (`gremlin-go`): renamed
`MaximumConcurrentConnections`->`MaxConnections`,
`IdleConnectionTimeout`->`IdleTimeout`,
+ `Auth.BasicAuth`/`Auth.SigV4Auth`->`Auth.Basic`/`Auth.Sigv4`. New:
`ReadTimeout`, `MaxResponseHeaderBytes`,
+ `Proxy`, `Ssl`, `BulkResults`.
+- *Go* (`gremlin-go`): Renamed:
`MaximumConcurrentConnections`->`MaxConnections`,
`IdleConnectionTimeout`->`IdleTimeout`,
`KeepAliveInterval`->`KeepAliveTime`, `ConnectionTimeout`->`ConnectTimeout`,
`TlsConfig`->`Ssl`, `RequestInterceptors`->`Interceptors`,
- `EnableCompression`->`Compression`; old struct fields removed. Auth helpers
moved from package `gremlingo`
+ `EnableCompression`->`Compression`. Auth helpers moved from package
`gremlingo`
(`BasicAuth`/`SigV4Auth`/`SigV4AuthWithCredentials`) into a new `auth`
sub-package (`auth.Basic`/`auth.SigV4`/`auth.SigV4WithCredentials`).
New: `ReadTimeout(Millis)`, `MaxResponseHeaderBytes`, `Proxy` (defaults to
`http.ProxyFromEnvironment`), `BatchSize`, `BulkResults`.
- *JavaScript* (`gremlin-javascript`): adopted `undici` as a pinned dependency
providing the default dispatcher built from the
- options above. Renamed `reader`->`responseSerializer`. New:
`readTimeoutMillis`, `keepAliveTimeMillis`, `maxResponseHeaderBytes`,
+ options above. Renamed: `reader`->`responseSerializer`. New:
`readTimeoutMillis`, `keepAliveTimeMillis`, `maxResponseHeaderBytes`,
`proxy`, `compression`, `batchSize`, `bulkResults`, `logger`. Removed
`headers` (use interceptors) and the
`ca`/`cert`/`pfx`/`rejectUnauthorized`/`agent` options (TLS is configured
through the Node/undici runtime). undici is swapped
out in browser bundles, where these connection-pool options are managed by
the browser.
See:
link:https://lists.apache.org/thread/yqtr2wnb1kq2pqqq4002cz511q5o0bkg[[DISCUSS]
Standardizing GLV connection options in TinkerPop 4].
-==== Java 17 Required; Java 21 and 25 Supported
-
-TinkerPop 4.0 raises the minimum Java version from 11 to 17 for both building
and running, and adds support for running
-on Java 21 and Java 25, so that every LTS release from the new minimum upward
is covered by TinkerPop's automated
-tests. *(breaking)* Supporting Java 25 required upgrading Groovy to 4.0.32
(whose bundled ASM can parse Java 25
-bytecode) and Hadoop to 3.4.3 (which moved off the `Subject.getSubject()` API
that was removed along with the Security
-Manager). Spark was upgraded to 4.1.x, built on Scala 2.13 — the first Spark
line that supports Java 25. Because Spark 4
-requires Java 17 as its minimum, and `spark-gremlin` is part of the build, the
project-wide minimum is now Java 17.
-Netty was upgraded to 4.2.x as required by Spark 4.
-
-As with the earlier JDK 17 support, some libraries still rely on deep
reflection (most notably the Kryo serialization
-library used with OLAP), so it may be necessary to `--add-opens` or
`--add-exports` certain modules at runtime. The set
-of options used by TinkerPop's own tests is unchanged.
-
==== Renaming `evaluationTimeout` to `timeoutMillis`
The per-request execution timeout is now referred to by a single name,
`timeoutMillis`, everywhere. `timeoutMillis` is
@@ -177,6 +163,20 @@ This is a breaking change with no backward-compatible
alias. The old `evaluation
Driver and server should be upgraded together. A driver sending the old
`evaluationTimeout` field to a 4.x server has
that field silently ignored and falls back to the server's default timeout, as
with any unrecognized request argument.
+==== Java Runtime Upgrade
+
+TinkerPop 4.0 raises the minimum Java version from 11 to 17 for both building
and running, and adds support for running
+on Java 21 and Java 25. Supporting Java 25 required upgrading Groovy to
4.0.32, Hadoop to 3.4.3, Spark to 4.1.x, and
+Netty to 4.2.x. These upgrades collectively prohibit building on Java 11, but
enable support in Java 21 and 25.
+
+As with the earlier JDK 17 support, some libraries still rely on deep
reflection (most notably the Kryo serialization
+library used with OLAP), so it may be necessary to `--add-opens` or
`--add-exports` certain modules at runtime. The set
+of options used by TinkerPop's own tests is unchanged.
+
+==== .NET Runtime Upgrade
+
+The minimum target framework is now `net8.0` (previously
`netstandard2.0;net6.0`).
+
==== Declarative Pattern Matching
Gremlin has always offered both imperative and declarative styles to writing
graph queries. While the imperative style
@@ -377,7 +377,13 @@ anonymized form. The original gremlator.com was a
prototype built by TinkerPop c
previous implementation required Java and a running Gremlin Server, whereas
the new version runs entirely in the
browser with no server infrastructure needed.
-==== GLV Transaction Support
+==== Transactions
+
+TinkerPop 4.0 brings a set of related transaction changes across the drivers
and embedded graphs: explicit remote
+transaction support in every GLV, closure-based managed transaction blocks,
the replacement of `open()` with
+`begin()`, and a safer default close behavior. Each is described below.
+
+===== GLV Transaction Support
All non-Java Gremlin Language Variants (gremlin-python, gremlin-go,
gremlin-javascript, gremlin-dotnet) now support
explicit remote transactions over HTTP. The transaction model is the same
across all GLVs: begin a transaction, submit
@@ -398,7 +404,7 @@ Key behaviors consistent across all GLVs:
See the <<gremlin-drivers-variants,Gremlin Drivers and Variants>> reference
documentation for language-specific
syntax and examples.
-==== Managed Transaction Blocks
+===== Managed Transaction Blocks
In addition to the manual `begin()`/`commit()`/`rollback()` lifecycle, every
GLV (including the Java driver and embedded
Java graphs) now offers closure-based convenience methods directly on
`GraphTraversalSource` (`g`). You hand `g` a
@@ -425,7 +431,7 @@ examples.
See: link:https://issues.apache.org/jira/browse/TINKERPOP-3253[TINKERPOP-3253]
-==== `Transaction.open()` Replaced by `begin()`
+===== `Transaction.open()` Replaced by `begin()`
The `open()` method has been removed from the `Transaction` API. Use `begin()`
instead, which is now the single
transaction-start method for both embedded and remote contexts. Replace any
`tx.open()` or `g.tx().open()` calls with
@@ -440,7 +446,7 @@
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#transactions[Traversal T
See: link:https://issues.apache.org/jira/browse/TINKERPOP-3252[TINKERPOP-3252]
-==== Transaction Default Close Behavior Changed
+===== Transaction Default Close Behavior Changed
The default behavior of `close()` on a remote transaction has been changed
from `commit` to `rollback` across all
GLVs (including the Java driver). This aligns with the embedded graph
transaction default and is the safer behavior:
@@ -505,43 +511,6 @@
link:https://issues.apache.org/jira/browse/TINKERPOP-2777[TINKERPOP-2777],
link:https://issues.apache.org/jira/browse/TINKERPOP-3005[TINKERPOP-3005],
link:https://issues.apache.org/jira/browse/TINKERPOP-1463[TINKERPOP-1463]
-==== Removed `uuid` Dependency in gremlin-javascript
-
-The `uuid` npm package has been removed from `gremlin-javascript`. UUID
generation now uses the built-in
-`globalThis.crypto.randomUUID()` API, which is available in Node.js 19+ and
all modern browsers.
-
-This change has no impact on how UUID values are sent to or received from the
server — UUID serialization and
-deserialization in GraphBinary is unchanged. Applications that depend on the
`uuid` package solely because
-`gremlin-javascript` brought it in as a transitive dependency should add it
directly to their own `package.json`
-if they still need it.
-
-==== JS HTTP Streaming Response Support
-
-The JavaScript driver now supports incremental HTTP streaming. Results are
deserialized from the server response as
-they arrive, rather than buffering the entire response before processing.
-
-Traversal API terminal steps (`next()`, `toList()`, `hasNext()`) are now truly
incremental. `next()`
-returns the first result as soon as it is deserialized from the wire, without
waiting for the full response.
-In 3.x, `next()` waited for all WebSocket frames before returning.
-
-`Client.stream()` now returns an `AsyncGenerator` for direct incremental
consumption. This is a breaking change
-from 3.x where `stream()` returned a Node.js `Readable`. The new return type
works in both Node.js and browsers:
-
-[source,javascript]
-----
-// 3.x — Readable stream (no longer supported)
-// const stream = client.stream('g.V()');
-// stream.on('data', (resultSet) => { ... });
-
-// 4.0 — AsyncGenerator
-for await (const item of client.stream('g.V()', null)) {
- console.log(item);
- if (someCondition) break; // stops reading from the HTTP stream
-}
-----
-
-`Client.submit()` remains unchanged. It still buffers the full response and
returns `Promise<ResultSet>`.
-
==== New Gremlin-Lang Literals
The canonical Gremlin grammar now includes literal syntax for `Character`,
`Duration`, and `Binary` types. These
@@ -601,27 +570,6 @@ g.V().has("blob",P.eq(Binary("AQID")))
See: link:https://issues.apache.org/jira/browse/TINKERPOP-3153[TINKERPOP-3153]
-==== Python HTTP Streaming Response Support
-
-The Python driver now streams results directly from the HTTP response body
through the configured
-`response_serializer`. Results are available to the caller as they arrive from
the server, rather than waiting for
-the full response to be buffered in memory. This improves memory efficiency
for large result sets and reduces
-time-to-first-result.
-
-Traversal API terminal steps (`next()`, `to_list()`, `has_next()`) are now
truly incremental. `next()` returns the
-first result as soon as it is deserialized from the wire, without waiting for
the full response. In 3.x, `next()`
-waited for all data to be buffered before returning.
-
-The following internal APIs have changed:
-
-- `max_content_length` is no longer supported. Response size limits should be
configured server-side via
- `maxRequestContentLength`.
-- The built-in response serializer is `GraphBinarySerializersV4`. The receive
path dispatches through the
- configured `response_serializer`.
-- `ResultSet` now yields individual items instead of lists when iterated. Code
that uses `results += result`
- to accumulate results from a `ResultSet` iterator must change to
`results.append(result)`. The `to_list()`
- and `all()` APIs are unaffected and remain the recommended way to collect
results.
-
==== Python Driver Simplification — Removed GraphSON, Abstract Base Classes,
and Protocol Layer
The `AbstractBaseTransport`, `AbstractBaseProtocol`, and
`GremlinServerHTTPProtocol` classes have been removed from
@@ -685,19 +633,59 @@ replacement planned for this functionality.
See: link:https://issues.apache.org/jira/browse/TINKERPOP-3249[TINKERPOP-3249]
-==== Runtime Upgrades
+==== HTTP Streaming Response Support
+
+With the move to HTTP, the drivers now deserialize responses incrementally,
delivering results to the caller as they
+arrive from the server rather than buffering the entire response before
processing. This reduces time-to-first-result
+and memory usage for large result sets. The runtime behavior and API impact
differ per language variant, as described
+below.
+
+===== Java
+
+Results are delivered to the `ResultSet` as they arrive. Streaming applies
only when using the default GraphBinary
+serializer, custom `MessageSerializer` implementations fall back to the
non-streaming pipeline that buffers the full
+response before deserialization. The `ResultSet` API is unchanged.
+
+===== Python
+
+The Python driver streams results through the configured `response_serializer`.
+
+Traversal API terminal steps (`next()`, `to_list()`, `has_next()`) are now
truly incremental. `next()` returns the
+first result as soon as it is deserialized from the wire, without waiting for
the full response. In 3.x, `next()`
+waited for all data to be buffered before returning.
+
+Note: `ResultSet` now yields individual items instead of lists when iterated.
Code that uses `results += result` to
+accumulate results from a `ResultSet` iterator must change to
`results.append(result)`. The `to_list()` and `all()` APIs
+are unaffected and remain the recommended way to collect results.
+
+===== JavaScript
+
+Traversal API terminal steps (`next()`, `toList()`, `hasNext()`) are now truly
incremental. `next()`
+returns the first result as soon as it is deserialized from the wire, without
waiting for the full response.
+In 3.x, `next()` waited for all WebSocket frames before returning.
-The minimum target framework is now `net8.0` (previously
`netstandard2.0;net6.0`). .NET 6 reached end-of-life in
-November 2024; .NET 8 is the current LTS release.
+`Client.stream()` now returns an `AsyncGenerator` for direct incremental
consumption. This is a breaking change
+from 3.x where `stream()` returned a Node.js `Readable`. The new return type
works in both Node.js and browsers:
-==== .NET HTTP Streaming Response Support
+[source,javascript]
+----
+// 3.x — Readable stream (no longer supported)
+const stream = client.stream('g.V()');
+stream.on('data', (resultSet) => { ... });
-The .NET driver (`Gremlin.Net`) now uses streaming deserialization, results
are deserialized incrementally from the
-HTTP response stream as bytes arrive over the network, rather than buffering
the entire response before processing.
-This reduces memory usage and latency for large result sets.
+// 4.0 — AsyncGenerator
+for await (const item of client.stream('g.V()', null)) {
+ console.log(item);
+ if (someCondition) break; // stops reading from the HTTP stream
+}
+----
+
+`Client.submit()` remains unchanged. It still buffers the full response and
returns `Promise<ResultSet>`.
-The traversal API (`Next()`, `ToList()`, `HasNext()`, `ToSet()`, `Iterate()`)
is unchanged — these methods block
-internally on the async stream, so existing traversal code works without
modification.
+===== .NET
+
+The traversal API (`Next()`, `ToList()`, `HasNext()`, `ToSet()`, `Iterate()`)
in `Gremlin.Net` is unchanged. These
+methods block internally on the async stream, so existing traversal code works
without modification.
`ResultSet<T>` no longer implements `IReadOnlyCollection<T>`. It now
implements `IAsyncEnumerable<T>`, backed by a
`Channel<T>` that receives items from a background deserialization task. Users
who access `ResultSet<T>` directly
@@ -741,15 +729,6 @@ try {
The traversal API is not affected — `Next()`, `ToList()`, etc. still throw
`ResponseException` directly since they
block on the async stream internally.
-==== Streaming Response Deserialization in gremlin-driver
-
-The Java driver now deserializes HTTP responses incrementally, delivering
results to the `ResultSet` as they arrive
-rather than buffering the entire response. This reduces time-to-first-result
for large result sets.
-
-This change is automatic and requires no code changes. It applies only when
using the default GraphBinary serializer.
-Custom `MessageSerializer` implementations fall back to the non-streaming
pipeline that buffers the full response
-before deserialization. The `ResultSet` API is unchanged.
-
==== More Secure Gremlin Server
Previous versions of Gremlin Server relied on a Gremlin-flavored Groovy
`ScriptEngine` for basic server initialization,
@@ -883,7 +862,7 @@
link:https://issues.apache.org/jira/browse/TINKERPOP-3107[TINKERPOP-3107]
==== `gremlin-lang` based Parameters
-Bindings/parameters that are sent as part of the request are now
`gremlin-lang` string maps rather than an actual Map
+Parameters that are sent as part of the request are now `gremlin-lang` string
maps rather than an actual Map
that would have been serialized based on the serializer used for the request.
A side effect of this is that the map key
must be a valid Java identifier. This means that certain items can no longer
be sent like `#jsr223` control flags that
were used for the `gremlin-groovy` ScriptEngine. Ensure that you are using
valid Java identifiers (e.g. start with a
@@ -912,11 +891,11 @@ See:
link:https://issues.apache.org/jira/browse/TINKERPOP-3247[TINKERPOP-3247]
of the Gremlin Language Variants. Users of the Python, JavaScript, .NET, and
Go drivers can construct a `GValue` and
pass it to a parameterizable step; the driver sends the value to the server as
a named parameter rather than inlining
it as a literal. See the "GValue Parameterization" reference documentation for
-link:https://tinkerpop.apache.org/docs/4.0.0/reference/#gremlin-java-gvalue[Java],
-link:https://tinkerpop.apache.org/docs/4.0.0/reference/#gremlin-python-gvalue[Python],
-link:https://tinkerpop.apache.org/docs/4.0.0/reference/#gremlin-javascript-gvalue[JavaScript],
-link:https://tinkerpop.apache.org/docs/4.0.0/reference/#gremlin-dotnet-gvalue[.NET],
and
-link:https://tinkerpop.apache.org/docs/4.0.0/reference/#gremlin-go-gvalue[Go]
for construction syntax and examples.
+link:https://tinkerpop.apache.org/docs/4.0.0-beta.3/reference/#gremlin-java-gvalue[Java],
+link:https://tinkerpop.apache.org/docs/4.0.0-beta.3/reference/#gremlin-python-gvalue[Python],
+link:https://tinkerpop.apache.org/docs/4.0.0-beta.3/reference/#gremlin-javascript-gvalue[JavaScript],
+link:https://tinkerpop.apache.org/docs/4.0.0-beta.3/reference/#gremlin-dotnet-gvalue[.NET],
and
+link:https://tinkerpop.apache.org/docs/4.0.0-beta.3/reference/#gremlin-go-gvalue[Go]
for construction syntax and examples.
The leading-underscore restriction on `GValue` names that was present in 3.8.0
has been removed. Parameter names
beginning with `_` are now accepted in Java and across all language variants.
The only remaining constraints are that
@@ -1055,9 +1034,7 @@ benefiting all driver users transparently.
See <<provider-defined-types>> for full details on annotation usage, field
filtering, nested types, and ServiceLoader
registration.
-===== Primitive Provider Defined Types
-
-In addition to composite PDTs (which carry a map of fields), providers can now
expose *Primitive PDTs* — types
+In addition to composite PDTs (which carry a map of fields), providers can
also expose *Primitive PDTs*, types
represented as a single opaque stringified value (GraphBinary type `0xf1`,
GraphSON type `g:PrimitivePdt`). This is
ideal for types with no native TinkerPop representation that can be expressed
as a single string, such as unsigned
integers or WKT geometry strings. Each GLV provides an adapter interface for
primitive PDTs
@@ -1065,10 +1042,6 @@ integers or WKT geometry strings. Each GLV provides an
adapter interface for pri
`RegisterPrimitiveFuncs` in Go, `IPrimitivePdtAdapter<T>` in .NET). A type may
be registered as composite or
primitive, not both. See <<primitive-provider-defined-types>> for details.
-`Tree` no longer extends `HashMap`. Provider code that inspected or rebuilt a
`Tree` via `Map` methods
-(`get`, `put`, `keySet`, `entrySet`, `size`) must use the tree-shaped API
instead: read with `rootNodes()` +
-`childAt(key)` and build with `getOrCreateChild(key)` + `addTree(subtree)`.
The GraphSON (`g:Tree`) and
-GraphBinary (`0x2b`) wire formats are unchanged, so no GraphSON- or
GraphBinary-serialized data or cross-version
===== Tree Serialization and API Changes
`Tree` no longer extends `HashMap`.
diff --git
a/tools/tinkerpop-docs/src/main/java/org/apache/tinkerpop/gremlin/docs/GremlinTreeprocessor.java
b/docs/tinkerpop-docs/src/main/java/org/apache/tinkerpop/gremlin/docs/GremlinTreeprocessor.java
similarity index 100%
rename from
tools/tinkerpop-docs/src/main/java/org/apache/tinkerpop/gremlin/docs/GremlinTreeprocessor.java
rename to
docs/tinkerpop-docs/src/main/java/org/apache/tinkerpop/gremlin/docs/GremlinTreeprocessor.java
diff --git
a/docs/tinkerpop-docs/src/test/java/org/apache/tinkerpop/gremlin/docs/GremlinTreeprocessorTest.java
b/docs/tinkerpop-docs/src/test/java/org/apache/tinkerpop/gremlin/docs/GremlinTreeprocessorTest.java
index 99f7e92550..e22dcb551c 100644
---
a/docs/tinkerpop-docs/src/test/java/org/apache/tinkerpop/gremlin/docs/GremlinTreeprocessorTest.java
+++
b/docs/tinkerpop-docs/src/test/java/org/apache/tinkerpop/gremlin/docs/GremlinTreeprocessorTest.java
@@ -82,7 +82,7 @@ public class GremlinTreeprocessorTest {
final String input = "=
Test\n\n[gremlin-groovy]\n----\n1+1\n----\n";
final String result = asciidoctor.convert(input,
Options.builder().build());
assertThat(result, is(notNullValue()));
- assertThat(executor.statements.contains("graph =
TinkerGraph.open(conf)"), is(true));
+ assertThat(executor.statements.contains("graph =
TinkerGraph.open()"), is(true));
assertThat(executor.statements.contains("g = graph.traversal()"),
is(true));
}
}