Thanks Ken! I'd like to propose an update I'm implementing as part of the GraphBinary4 IO spec update. I added a new request header "bulked", which takes a string and will turn on the {bulked} result flag in the Response Message when set to "true".
This change is inside of https://github.com/apache/tinkerpop/pull/2826. On 2024/10/11 04:30:05 Ken Hu wrote: > I've recently spent some more time thinking about the response format and I > think the results should be inside a list called data again. This > essentially turns it back into the GraphSONv3 ResponseMessage. So "result" > would be an object that contains an array called "data". It might be useful > to do this just in case there is some metadata that needs to be added to > the response. > > On Tue, May 7, 2024 at 1:59 PM Ken Hu <kenhu...@gmail.com> wrote: > > > Another update is that for GraphSONv4, the result field will no longer be > > null if there are no results instead it will become an empty array. This > > means that the new ResponseResult always expects a List<Object> rather than > > just an Object. > > > > Are there any concerns about changing it from being null to an empty array? > > > > On Wed, Apr 24, 2024 at 1:30 PM Ken Hu <kenhu...@gmail.com> wrote: > > > >> An update regarding the API, the materializeProperties option is being > >> added back which should be set to either "all" or "tokens". The "all" > >> option returns all the properties while the "tokens" option returns only > >> the id and label. So the request syntax currently looks like: > >> > >> ---------- Request Syntax ---------- > >> > >> POST /gremlin HTTP/1.1 > >> Accept: <<mimetype>> > >> Content-Type: <<mimetype>> > >> Gremlin-Hints: <<hints>> > >> > >> { > >> "gremlin": "string", > >> "timeoutMs": number, > >> "materializeProperties": "string", > >> "bindings": object, > >> "g": "string" > >> "language" : "string" > >> } > >> > >> Additionally, there seems to be a difference between options needed to > >> change server behavior (timeoutMs, materializeProperties) and options > >> needed to change the behavior of the Traversal. Currently, we allow these > >> server options to be set using the with() options. I think it makes sense > >> for these to only be set in the HTTP request body as it isn't information > >> needed by the traversal. This leads to a better separation of options that > >> affect both all traversals (embedded and remote) and options that are > >> server/remote only. This means that we would drop the GremlinScriptChecker > >> from the server that is used for parsing through a script for specific > >> with() options that the server needs. However, a user may need to set > >> specific options per query so we could add a GLV-only step like request(). > >> The request() step wouldn't be part of the language and would be something > >> that only the GLVs would recognize and would cause them to add those > >> options to the HTTP request body. It should be noted that request() is a > >> working idea, but for now, the most important point is that there will be a > >> way to set these server options per request from the GLVs. > >> > >> On Wed, Apr 10, 2024 at 12:45 PM Ken Hu <kenhu...@gmail.com> wrote: > >> > >>> Hi, > >>> > >>> The following is a reference of what the upcoming HTTP API will look > >>> like for the /gremlin resource. Some smaller items are probably subject to > >>> change. > >>> > >>> There are three differences between the 4.x HTTP API and the 3.x HTTP > >>> API that should be noted. First, the server always generates the requestId > >>> and returns it to the client. Second, the format of the request body has > >>> changed as the OpProcessors have been removed so the request fields have > >>> been flattened. Third, because the results are now streamed back to the > >>> user with chunked transfer encoding, there are certain errors that can > >>> occur after the initial 200 OK has been sent. This means that the user > >>> must > >>> check either the status object in the response body or the trailers to see > >>> if there are any errors. > >>> > >>> The format below uses a bit of pseudo-JSON to help represent request and > >>> response bodies. The actual format of the request and response bodies will > >>> be determined by the serializers defined via the "Accept" and > >>> "Content-Type" headers. As a result, a generic type definition in this > >>> document like "number" could translate to a "long" for a serializer that > >>> supports types like GraphBinary. > >>> > >>> > >>> ---------- Request Syntax ---------- > >>> > >>> POST /gremlin HTTP/1.1 > >>> Accept: <<mimetype>> > >>> Content-Type: <<mimetype>> > >>> Gremlin-Hints: <<hints>> > >>> > >>> { > >>> "gremlin": "string", > >>> "timeoutMs": number, > >>> "bindings": object, > >>> "g": "string" > >>> "language" : "string" > >>> } > >>> > >>> > >>> ---------- Headers ---------- > >>> > >>> Gremlin-Hints - When provided this header is a semi-colon separated list > >>> of key/value > >>> pair metadata that could be helpful to the server in > >>> processing a > >>> particular request in some way. > >>> Required: No > >>> > >>> ---------- Header Options ---------- > >>> > >>> mimetype - the serialization accepted for the response. > >>> Required: No. Defaults to > >>> "application/vnd.gremlin-v4.0+json;types=false" > >>> > >>> application/vnd.gremlin-v4.0+json;types=false > >>> GraphSON without embedded types that will be easy to parse and > >>> work with using > >>> cURL and similar tools. > >>> > >>> application/vnd.gremlin-v4.0+json;types=true > >>> GraphSON with embedded types, mostly present for consistency, so > >>> that both > >>> configurations of GraphSON are available. Note that official > >>> TinkerPop drivers > >>> will not support this serializer. > >>> > >>> application/vnd.graphbinary-v4.0 > >>> GraphBinary which has embedded types, mostly of use to Gremlin > >>> Language Drivers. > >>> > >>> hints > >>> mutations - Indicates if the Gremlin contains steps that can mutate > >>> the graph. The > >>> default would be "unknown". Language drivers would set > >>> this hint > >>> automatically at query submission by dynamically > >>> detecting mutating > >>> steps in the query being sent. > >>> yes | no | unknown > >>> > >>> > >>> ---------- Request Body ---------- > >>> > >>> gremlin - The Gremlin query to execute. > >>> Type: String > >>> Required: Yes. > >>> > >>> timeoutMs - The maximum time a query is allowed to execute in > >>> milliseconds. > >>> Type: Number > >>> Required: No. If not present, then server default is used. > >>> > >>> bindings - Any bindings used to execute the query. For example, the > >>> incoming Gremlin script might > >>> be g.V(x) where x=1 is a binding that would be applied to it. > >>> Type: object > >>> Required: No. > >>> > >>> g - The name of the graph traversal source to which the query applies. > >>> Type: String > >>> Required: No, defaults to "g" > >>> > >>> language - The name of the ScriptEngine to use to parse the gremlin > >>> query. > >>> Type: String > >>> Required: No, defaults to "gremlin-lang" > >>> > >>> > >>> ---------- Response Syntax ---------- > >>> > >>> HTTP/1.1 200 > >>> Content-type: <<mimetype>> > >>> Transfer-Encoding: chunked > >>> Gremlin-RequestId: uuid > >>> { > >>> "result": list, > >>> "status": object > >>> } > >>> > >>> ---------- Headers ---------- > >>> > >>> Gremlin-RequestId - A UUID to identify this request, which can be used > >>> to help trace the request on the server in logs and such. > >>> Type: uuid > >>> > >>> > >>> ---------- Response Elements ---------- > >>> result - A list of objects that represent the result of the query. > >>> Single objects are > >>> coerced to list. > >>> Type: list > >>> > >>> status - The actual status of the request after its been fully executed. > >>> Type: object > >>> > >>> > >>> ---------- Example Responses ---------- > >>> > >>> An example "result", in this case a single graph element, looks like the > >>> following: > >>> > >>> // g.V().limit(1) > >>> > >>> [ > >>> { > >>> "id": "string" > >>> "label": "string" > >>> "type": "string" > >>> "properties": object > >>> } > >>> ] > >>> > >>> An example "status", which comes at the very end of the response looks > >>> like the following: > >>> { > >>> code: "string" > >>> message: "string" > >>> exception: "string" > >>> } > >>> > >>> A concrete example would be: > >>> { > >>> "code": "400" > >>> "message": "An eval requires a gremlin argument" > >>> "exception": "InvalidRequestException" > >>> } > >>> > >>> The trailers will have the following format: > >>> > >>> Status: "number" > >>> Exception: "string" > >>> > >>> The status corresponds to the real status code and the exception is an > >>> exception class returned by the server. For example, > >>> > >>> Status: 429 > >>> Exception: TooManyRequestsException > >>> > >>> > >>> > >>> Are there any modifications or updates that you think would be > >>> appropriate? > >>> > >>> Thanks, > >>> Ken > >>> > >>> >