[GitHub] [tinkerpop] jorgebay commented on pull request #1547: Add GraphBinary serialization support to gremlin-javascript
jorgebay commented on pull request #1547: URL: https://github.com/apache/tinkerpop/pull/1547#issuecomment-1031211265 > passed using current state of GraphBinary NICE!!! -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@tinkerpop.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org
[tinkerpop] branch 3.5-dev updated: docs: Fix GraphBinary enum like types specification
This is an automated email from the ASF dual-hosted git repository. jorgebg pushed a commit to branch 3.5-dev in repository https://gitbox.apache.org/repos/asf/tinkerpop.git The following commit(s) were added to refs/heads/3.5-dev by this push: new a34280d docs: Fix GraphBinary enum like types specification new cbb3bea Merge pull request #1560 from ihoro/fix-graphbinary-enum-spec a34280d is described below commit a34280dc030b6aaffaf36509b60e38dec2da5073 Author: Igor Ostapenko AuthorDate: Thu Feb 3 20:24:39 2022 +0200 docs: Fix GraphBinary enum like types specification Enum like types (Barrier, Cardinality, Column, Direction, Operator, Order, Pick, Pop, Scope, T) should provide enum element name as a fully-qualified string, i.e. as {type_code}{type_info}{value_flag}{value}. --- docs/src/dev/io/graphbinary.asciidoc | 20 ++-- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/src/dev/io/graphbinary.asciidoc b/docs/src/dev/io/graphbinary.asciidoc index ecec755..9403857 100644 --- a/docs/src/dev/io/graphbinary.asciidoc +++ b/docs/src/dev/io/graphbinary.asciidoc @@ -356,7 +356,7 @@ properties. Note that as TinkerPop currently send "references" only, this value Barrier -Format: a single `String` representing the enum value. +Format: a fully qualified single `String` representing the enum value. Binding @@ -386,31 +386,31 @@ Where: Cardinality -Format: a single `String` representing the enum value. +Format: a fully qualified single `String` representing the enum value. Column -Format: a single `String` representing the enum value. +Format: a fully qualified single `String` representing the enum value. Direction -Format: a single `String` representing the enum value. +Format: a fully qualified single `String` representing the enum value. Operator -Format: a single `String` representing the enum value. +Format: a fully qualified single `String` representing the enum value. Order -Format: a single `String` representing the enum value. +Format: a fully qualified single `String` representing the enum value. Pick -Format: a single `String` representing the enum value. +Format: a fully qualified single `String` representing the enum value. Pop -Format: a single `String` representing the enum value. +Format: a fully qualified single `String` representing the enum value. Lambda @@ -433,11 +433,11 @@ Where: Scope -Format: a single `String` representing the enum value. +Format: a fully qualified single `String` representing the enum value. T -Format: a single `String` representing the enum value. +Format: a fully qualified single `String` representing the enum value. Traverser
[GitHub] [tinkerpop] jorgebay merged pull request #1560: docs: Fix GraphBinary enum like types specification
jorgebay merged pull request #1560: URL: https://github.com/apache/tinkerpop/pull/1560 -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@tinkerpop.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org
[tinkerpop] 01/01: Merge remote-tracking branch 'origin/3.5-dev'
This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tinkerpop.git commit de4e35353e298ec0a029dd698368c353a19a6f24 Merge: 71b335f cbb3bea Author: Stephen Mallette AuthorDate: Mon Feb 7 06:31:55 2022 -0500 Merge remote-tracking branch 'origin/3.5-dev' docs/src/dev/io/graphbinary.asciidoc | 20 ++-- 1 file changed, 10 insertions(+), 10 deletions(-)
[tinkerpop] branch master updated (71b335f -> de4e353)
This is an automated email from the ASF dual-hosted git repository. spmallette pushed a change to branch master in repository https://gitbox.apache.org/repos/asf/tinkerpop.git. from 71b335f Remove gryo message tests add a34280d docs: Fix GraphBinary enum like types specification add cbb3bea Merge pull request #1560 from ihoro/fix-graphbinary-enum-spec new de4e353 Merge remote-tracking branch 'origin/3.5-dev' The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "add" were already present in the repository and have only been added to this reference. Summary of changes: docs/src/dev/io/graphbinary.asciidoc | 20 ++-- 1 file changed, 10 insertions(+), 10 deletions(-)
[tinkerpop] 01/02: Prevent creation of vertices if they do not exist for mergeE()
This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch TINKERPOP-2681 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git commit 2337b5a96b18600b3b684da09c2fe22983d31975 Author: Stephen Mallette AuthorDate: Sat Feb 5 09:52:48 2022 -0500 Prevent creation of vertices if they do not exist for mergeE() --- .../process/traversal/step/map/MergeEdgeStep.java | 28 +++ .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 5 +-- .../gremlin-javascript/test/cucumber/gremlin.js| 5 +-- gremlin-python/src/main/python/radish/gremlin.py | 5 +-- gremlin-test/features/map/MergeEdge.feature| 40 -- .../process/traversal/step/map/MergeEdgeTest.java | 17 + 6 files changed, 71 insertions(+), 29 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java index 94d4273..7734f95 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java @@ -279,6 +279,13 @@ public class MergeEdgeStep extends FlatMapStep implements Mutating keyValues = new ArrayList<>(); String label = Edge.DEFAULT_LABEL; @@ -292,11 +299,9 @@ public class MergeEdgeStep extends FlatMapStep implements Mutating) entry.getValue()) - .attach(Attachable.Method.getOrCreate(this.getTraversal().getGraph().orElse(EmptyGraph.instance(; +toV = tryAttachVertex((Attachable) entry.getValue()); } else if (useOnCreate && entry.getKey().equals(Direction.OUT)) { -fromV = ((Attachable) entry.getValue()) - .attach(Attachable.Method.getOrCreate(this.getTraversal().getGraph().orElse(EmptyGraph.instance(; +fromV = tryAttachVertex((Attachable) entry.getValue()); } } else if (entry.getKey().equals(T.label)) { label = (String) entry.getValue(); @@ -335,14 +340,25 @@ public class MergeEdgeStep extends FlatMapStep implements Mutating) v) - .attach(Attachable.Method.getOrCreate(this.getTraversal().getGraph().orElse(EmptyGraph.instance(; +return tryAttachVertex((Attachable) v); } else { return v; } } /** + * Tries to attach a {@link Vertex} to its host {@link Graph} of the traversal. If the {@link Vertex} cannot be + * found then an {@code IllegalArgumentException} is expected. + */ +protected Vertex tryAttachVertex(final Attachable attachable) { +try { +return attachable.attach(Attachable.Method.get(this.getTraversal().getGraph().orElse(EmptyGraph.instance(; +} catch (IllegalStateException ise) { +throw new IllegalArgumentException(String.format("%s could not be found and edge could not be created", attachable)); +} +} + +/** * Validates input to any {@code Map} arguments to this step. For {@link Merge#onMatch} updates cannot be applied * to immutable parts of an {@link Edge} (id, label, incident vertices) so those can be ignored in the validation. */ diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs index d600ff9..95c4069 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs @@ -505,8 +505,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin {"g_withSideEffectXa_label_knows_out_marko_in_vadasX_mergeEXselectXaXX", new List, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,100).Property("name","marko").AddV("person").Property(T.Id,101).Property("name","vadas"), (g,p) =>g.WithSideEffect("a",p["xx1"]).MergeE((IDictionary) __.Select("a")), (g,p) =>g.V().Has("person","name","marko").Out("knows").Has("person","name","vadas")}}, {"g_mergeEXlabel_knows_out_marko1_in_vadas1X", new List, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,100).Property("name","marko").AddV("person").Property(T.Id,101).Property("name","vadas"), (g,p) =>g.MergeE((IDictionary) p["xx1"]), (g,p) =>g.V().Has("person","name","marko").Out("knows").Has("person","name","vadas")}}, {"g_mergeEXlabel_knows_out_marko_in_vadas_weight_05X_exists", new List, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,100).Property("name","marko").As("a").AddV("person").Property(T.Id,101).Property("name","vadas").As("b").AddE("knows").From("a").To("b"), (g,p) =>g.MergeE((IDictionary) p["xx1"]), (g,p)
[tinkerpop] 02/02: TINKERPOP-2681 Finalize mergeV semantics around null/empty args
This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch TINKERPOP-2681 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git commit 8939d5ea4a1ad7dcf27c5b9c807ae17fa93078ad Author: Stephen Mallette AuthorDate: Mon Feb 7 07:27:45 2022 -0500 TINKERPOP-2681 Finalize mergeV semantics around null/empty args --- docs/src/dev/provider/gremlin-semantics.asciidoc | 66 .../language/grammar/TraversalMethodVisitor.java | 10 ++ .../grammar/TraversalSourceSpawnMethodVisitor.java | 6 ++ .../traversal/step/map/MergeVertexStep.java| 90 ++-- gremlin-language/src/main/antlr4/Gremlin.g4| 11 +- gremlin-test/features/map/MergeVertex.feature | 116 + .../traversal/step/map/TinkerMergeVertexStep.java | 4 +- 7 files changed, 263 insertions(+), 40 deletions(-) diff --git a/docs/src/dev/provider/gremlin-semantics.asciidoc b/docs/src/dev/provider/gremlin-semantics.asciidoc index 3bb1244..c6a0223 100644 --- a/docs/src/dev/provider/gremlin-semantics.asciidoc +++ b/docs/src/dev/provider/gremlin-semantics.asciidoc @@ -590,3 +590,69 @@ Same as Comparability, except orderability semantics apply for element compariso * If the unknown arguments are of different types or do not define a natural order, order first by Classname, then by `Object.toString()`. +== Steps + +While TinkerPop has a full test suite for validating functionality of Gremlin, tests alone aren't always exhaustive or +fully demonstrative of Gremlin step semantics. It is also hard to simply read the tests to understand exactly how a +step is meant to behave. This section discusses the semantics for individual steps to help users and providers +understand implementation expectations. + +=== mergeE() + + + +=== mergeV() + +*Description:* Provides upsert-like functionality for vertices. +*Syntax:* `mergeV()` | `mergeV(Map)` | `mergeV(Traversal)` + +[width="100%",options="header"] +|= +|Start Step |Mid Step |Modulated |Domain |Range +|Y |Y |`option()` |`Map` |`Vertex` + +*Arguments:* + +* `searchCreate` - A `Map` used to match a `Vertex` and if not found be the default set of data to create the new one. +* `onCreate` - A `Map` that is the override to the default of `searchCreate` +* `onMatch` - A `Map` used to update the `Vertex` that is found using the `searchCreate` criteria. + +The `searchCreate` and `onCreate` `Map` instances must consists of any combination of `T.id`, `T.label`, or arbitrary +`String` keys (which are assumed to be vertex properties). The `onMatch` `Map` instance only allows for `String` keys +as the `id` and `label` of a `Vertex` are immutable. Values for these valid keys that are `null` will be treated +according to the semantics of the `addV()` step. + +The `Map` that is used as the argument for `searchCreate` may be assigned from the incoming `Traverser` for the no-arg +`mergeV()`. If `mergeV(Map)` is used, then it will override the incoming `Traverser`. If `mergeV(Traversal)` is used, +the `Traversal` argument must resolve to a `Map` and it would also override the incoming Traverser. The `onCreate` and +`onMatch` arguments are assigned via modulation as described below. + +[width="100%",options="header"] +|= +|Event |Null `Map` |Empty `Map` +|Search |Filters all vertices |Matches all vertices +|Create |No new vertex |New vertex with defaults +|Update |No update to matched vertex |No update to matched vertex +|= + +If `T.id` is used for `searchCreate` or `onCreate`, it may be ignored for vertex creation if the `Graph` does not +support user supplied identifiers. + +*Modulation:* + +* `option(Merge, Map)` - Sets the `onCreate` or `onMatch` arguments directly. +* `option(Merge, Traversal)` - Sets the `onCreate` or `onMatch` arguments dynamically where the `Traversal` must +resolve to a `Map`. + +*Exceptions* + +* `Map` arguments are validated for their keys resulting in exception if they do not meet requirements defined above. +* Use of `T.label` should always have a value that is a `String`. + +*Considerations:* + +* `mergeV()` Can only be used mid-traversal. It is not a start step. +* As is common to Gremlin, it is expected that `Traversal` arguments may utilize `sideEffect()` steps. + +See: link:https://github.com/apache/tinkerpop/tree/master/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java[source], +link:https://tinkerpop.apache.org/docs/current/reference/#mergev-step[reference] \ No newline at end of file diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java index ed1ae19..ed630cc 100644 --- a/gr
[tinkerpop] branch TINKERPOP-2681 updated (ce3924c -> 8939d5e)
This is an automated email from the ASF dual-hosted git repository. spmallette pushed a change to branch TINKERPOP-2681 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git. from ce3924c Added from/to aliases for Direction OUT/IN new 2337b5a Prevent creation of vertices if they do not exist for mergeE() new 8939d5e TINKERPOP-2681 Finalize mergeV semantics around null/empty args The 2 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "add" were already present in the repository and have only been added to this reference. Summary of changes: docs/src/dev/provider/gremlin-semantics.asciidoc | 66 .../language/grammar/TraversalMethodVisitor.java | 10 ++ .../grammar/TraversalSourceSpawnMethodVisitor.java | 6 ++ .../process/traversal/step/map/MergeEdgeStep.java | 28 +++-- .../traversal/step/map/MergeVertexStep.java| 90 ++-- .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 5 +- .../gremlin-javascript/test/cucumber/gremlin.js| 5 +- gremlin-language/src/main/antlr4/Gremlin.g4| 11 +- gremlin-python/src/main/python/radish/gremlin.py | 5 +- gremlin-test/features/map/MergeEdge.feature| 40 +-- gremlin-test/features/map/MergeVertex.feature | 116 + .../process/traversal/step/map/MergeEdgeTest.java | 17 +-- .../traversal/step/map/TinkerMergeVertexStep.java | 4 +- 13 files changed, 334 insertions(+), 69 deletions(-)
[GitHub] [tinkerpop] divijvaidya commented on a change in pull request #1556: Milestone 1 of the gremlin-go driver
divijvaidya commented on a change in pull request #1556: URL: https://github.com/apache/tinkerpop/pull/1556#discussion_r800879591 ## File path: gremlin-go/go.mod ## @@ -0,0 +1,18 @@ +module github.com/lyndonb-bq/tinkerpop/gremlin-go + +go 1.17 + +require ( + github.com/google/uuid v1.3.0 Review comment: please ensure that the libraries satisfies the Apache requirement for third party libraries. https://www.apache.org/legal/resolved.html#category-a ## File path: gremlin-go/driver/connection.go ## @@ -0,0 +1,68 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +package gremlingo + +type connection struct { Review comment: From my experience of maintaining other clients, I have observed that making a concept of `state` in multiple client entities could be very useful for debugging. My suggestion would be to add stateful transition to the lifecycle of a connection such as: Initialised Connection With Remote Initiated Connection With Remote Established Close request received Close in progress Closed These state transitions help us model various edge cases such as what happens when a connection receives a message to disconnect when it is in "Connection With Remote Initiated" state. ## File path: gremlin-go/driver/connection.go ## @@ -0,0 +1,68 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +package gremlingo + +type connection struct { + hoststring + portint + transporterType TransporterType + logHandler *logHandler + transporter transporter + protocolprotocol + results map[string]ResultSet +} + +func (connection *connection) close() (err error) { + if connection.transporter != nil { + err = connection.transporter.Close() + } + return +} + +func (connection *connection) connect() error { + if connection.transporter != nil { + closeErr := connection.transporter.Close() + connection.logHandler.logf(Warning, transportCloseFailed, closeErr) + } + connection.protocol = newGremlinServerWSProtocol(connection.logHandler) + connection.transporter = getTransportLayer(connection.transporterType, connection.host, connection.port) + err := connection.transporter.Connect() + if err != nil { + return err + } + connection.protocol.connectionMade(connection.transporter) + return nil +} + +func (connection *connection) write(request *request) (ResultSet, error) { + if connection.transporter == nil || connection.transporter.IsClosed() { + err := connection.connect() Review comment: Let's keep things simple and not retry to re-connect here. A connection should be in "connected" state if we want to write on it. Else throw an error about illegal state and the upper layers should choose a different connection to work with. ## File path: gremlin-go/driver/serializer.go ## @@ -0,0 +1,343 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.a
[tinkerpop] branch TINKERPOP-2681 updated (8939d5e -> 3b187a5)
This is an automated email from the ASF dual-hosted git repository. spmallette pushed a change to branch TINKERPOP-2681 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git. from 8939d5e TINKERPOP-2681 Finalize mergeV semantics around null/empty args add 3b187a5 TINKERPOP-2681 Fixed problems with GLVs processing null No new revisions were added by this update. Summary of changes: .../traversal/dsl/graph/GraphTraversal.java| 6 +- .../traversal/translator/DotNetTranslator.java | 4 +- .../traversal/translator/DotNetTranslatorTest.java | 8 +++ gremlin-dotnet/build/generate.groovy | 10 +++ .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 7 ++ .../ast/AmbiguousMethodASTTransformation.groovy| 82 ++ .../jsr223/GremlinGroovyScriptEngineTest.java | 22 -- gremlin-javascript/build/generate.groovy | 11 +++ .../gremlin-javascript/test/cucumber/gremlin.js| 7 ++ gremlin-python/build/generate.groovy | 10 +++ gremlin-python/src/main/python/radish/gremlin.py | 7 ++ 11 files changed, 164 insertions(+), 10 deletions(-) create mode 100644 gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/ast/AmbiguousMethodASTTransformation.groovy
[tinkerpop] branch TINKERPOP-2681 updated (3b187a5 -> 756d464)
This is an automated email from the ASF dual-hosted git repository. spmallette pushed a change to branch TINKERPOP-2681 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git. from 3b187a5 TINKERPOP-2681 Fixed problems with GLVs processing null add 756d464 mergeE() fixup No new revisions were added by this update. Summary of changes: .../process/traversal/step/map/MergeEdgeStep.java | 6 -- gremlin-test/features/map/MergeEdge.feature| 23 ++ 2 files changed, 27 insertions(+), 2 deletions(-)
[GitHub] [tinkerpop] lyndonb-bq commented on a change in pull request #1556: Milestone 1 of the gremlin-go driver
lyndonb-bq commented on a change in pull request #1556: URL: https://github.com/apache/tinkerpop/pull/1556#discussion_r801084685 ## File path: gremlin-go/driver/graphTraversalSource.go ## @@ -0,0 +1,23 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +package gremlingo + +type GraphTraversalSource interface { Review comment: @divijvaidya > Thank you for taking up this body of work. > > Please add a style guide for GoLang that other future develops contributing to this code would follow. > > I added very initial comments based on first look. I will delve deeper into this PR in the coming days but as a general rule of thumb we would try to apply the learnings from structure of other clients and improve this one. Primary focus will be testability and debuggability of the client. Thanks for reviewing Divij, we will definitely look into that. We are having a bit of a hard time with the initial structure because of the way Golang works - if we move a file to a subfolder, it can now only access public facing structs of other classes within the project. However as we get more components in, I think we can begin to organize this better. We look forward to the feedback you will be giving and will incorporate it into the coming Milestones. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@tinkerpop.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org