diff --git a/gremlin-dotnet/example/.gitignore b/gremlin-dotnet/example/.gitignore new file mode 100644 index 00000000000..91ee63afb57 --- /dev/null +++ b/gremlin-dotnet/example/.gitignore @@ -0,0 +1 @@ +/Gremlin.Net.3.7.0/ diff --git a/gremlin-dotnet/example/Example.cs b/gremlin-dotnet/example/Example.cs new file mode 100644 index 00000000000..f3b47d1d1ba --- /dev/null +++ b/gremlin-dotnet/example/Example.cs @@ -0,0 +1,132 @@ +/* +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. +*/ + +using Gremlin; +using Gremlin.Net.Driver; +using Gremlin.Net.Driver.Remote; +using Gremlin.Net.Structure.IO.GraphSON; +using Gremlin.Net.Process.Traversal; + +// Common imports +using static Gremlin.Net.Process.Traversal.AnonymousTraversalSource; +using static Gremlin.Net.Process.Traversal.__; +using static Gremlin.Net.Process.Traversal.P; +using static Gremlin.Net.Process.Traversal.Order; +using static Gremlin.Net.Process.Traversal.Operator; +using static Gremlin.Net.Process.Traversal.Pop; +using static Gremlin.Net.Process.Traversal.Scope; +using static Gremlin.Net.Process.Traversal.TextP; +using static Gremlin.Net.Process.Traversal.Column; +using static Gremlin.Net.Process.Traversal.Direction; +using static Gremlin.Net.Process.Traversal.Cardinality; +using static Gremlin.Net.Process.Traversal.CardinalityValue; +using static Gremlin.Net.Process.Traversal.T; + + +ConnectionExample(); +BasicGremlinExample(); +ModernTraversalExample(); + +static void ConnectionExample() +{ + var server = new GremlinServer("localhost", 8182); + + // Connecting to the server + // using var remoteConnection = new DriverRemoteConnection(new GremlinClient(server), "g"); + + // Connecting to the server with customized configurations + using var remoteConnection = new DriverRemoteConnection(new GremlinClient( + new GremlinServer(hostname:"localhost", port:8182, enableSsl:false, username:"", password:"")), "g"); + + // Specifying a serializer + var client = new GremlinClient(server, new GraphSON3MessageSerializer()); + + // Creating the graph traversal + var g = Traversal().WithRemote(remoteConnection); +} + +static void BasicGremlinExample() +{ + var server = new GremlinServer("localhost", 8182); + using var remoteConnection = new DriverRemoteConnection(new GremlinClient(server), "g"); + var g = Traversal().WithRemote(remoteConnection); + + // Basic Gremlin: adding and retrieving data + var v1 = g.AddV("person").Property("name", "marko").Next(); + var v2 = g.AddV("person").Property("name", "stephen").Next(); + var v3 = g.AddV("person").Property("name", "vadas").Next(); + + // Be sure to use a terminating step like next() or iterate() so that the traversal "executes" + // Iterate() does not return any data and is used to just generate side-effects (i.e. write data to the database) + g.V(v1).AddE("knows").To(v2).Property("weight", 0.75).Iterate(); + g.V(v1).AddE("knows").To(v3).Property("weight", 0.75).Iterate(); + + // Retrieve the data from the "marko" vertex + var marko = g.V().Has("person","name","marko").Values("name").Next(); + Console.WriteLine("name: " + marko); + // Find the "marko" vertex and then traverse to the people he "knows" and return their data + var peopleMarkoKnows = g.V().Has("person","name","marko").Out("knows").Values("name").ToList(); + foreach (var person in peopleMarkoKnows) + { + Console.WriteLine("marko knows " + person); + } +} + +static void ModernTraversalExample() +{ + var server = new GremlinServer("localhost", 8182); + using var remoteConnection = new DriverRemoteConnection(new GremlinClient(server), "g"); + var g = Traversal().WithRemote(remoteConnection); + + /* + This example requires the Modern toy graph to be preloaded upon launching the Gremlin server. + For details, see https://tinkerpop.apache.org/docs/current/reference/#gremlin-server-docker-image and use + conf/gremlin-server-modern.yaml. + */ + var e1 = g.V(1).BothE().ToList(); // (1) + var e2 = g.V(1).BothE().Where(OtherV().HasId(2)).ToList(); // (2) + var v1 = g.V(1).Next(); + var v2 = g.V(2).Next(); + var e3 = g.V(v1).BothE().Where(OtherV().Is(v2)).ToList(); // (3) + var e4 = g.V(v1).OutE().Where(InV().Is(v2)).ToList(); // (4) + var e5 = g.V(1).OutE().Where(InV().Has(T.Id, Within(2, 3))).ToList(); // (5) + var e6 = g.V(1).Out().Where(__.In().HasId(6)).ToList(); // (6) + + Console.WriteLine(string.Join(", ", e1)); + Console.WriteLine(string.Join(", ", e2)); + Console.WriteLine(string.Join(", ", e3)); + Console.WriteLine(string.Join(", ", e4)); + Console.WriteLine(string.Join(", ", e5)); + Console.WriteLine(string.Join(", ", e6)); + + /* + 1. There are three edges from the vertex with the identifier of "1". + 2. Filter those three edges using the Where()-step using the identifier of the vertex returned by OtherV() to + ensure it matches on the vertex of concern, which is the one with an identifier of "2". + 3. Note that the same traversal will work if there are actual Vertex instances rather than just vertex + identifiers. + 4. The vertex with identifier "1" has all outgoing edges, so it would also be acceptable to use the directional + steps of OutE() and InV() since the schema allows it. + 5. There is also no problem with filtering the terminating side of the traversal on multiple vertices, in this + case, vertices with identifiers "2" and "3". + 6. There’s no reason why the same pattern of exclusion used for edges with Where() can’t work for a vertex + + between two vertices. + */ +} \ No newline at end of file diff --git a/gremlin-dotnet/example/example.csproj b/gremlin-dotnet/example/example.csproj new file mode 100644 index 00000000000..e4eb34e582a --- /dev/null +++ b/gremlin-dotnet/example/example.csproj @@ -0,0 +1,14 @@ + + + + Exe + net7.0 + enable + enable + + + + + + + diff --git a/gremlin-dotnet/example/example.sln b/gremlin-dotnet/example/example.sln new file mode 100644 index 00000000000..b36b2dc87ac --- /dev/null +++ b/gremlin-dotnet/example/example.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 25.0.1706.4 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "example", "example.csproj", "{29ECA4F3-7C69-446D-8D00-4D396DE33C75}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {29ECA4F3-7C69-446D-8D00-4D396DE33C75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29ECA4F3-7C69-446D-8D00-4D396DE33C75}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29ECA4F3-7C69-446D-8D00-4D396DE33C75}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29ECA4F3-7C69-446D-8D00-4D396DE33C75}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FDC873E9-BBF5-41B1-BAE2-5AC9EBBC42DA} + EndGlobalSection +EndGlobal diff --git a/gremlin-driver/pom.xml b/gremlin-driver/pom.xml index 38a1f6918ee..7ce2439063d 100644 --- a/gremlin-driver/pom.xml +++ b/gremlin-driver/pom.xml @@ -253,6 +253,15 @@ limitations under the License. + + org.apache.maven.plugins + maven-compiler-plugin + + + example/** + + + diff --git a/gremlin-driver/src/main/java/example/Example.java b/gremlin-driver/src/main/java/example/Example.java new file mode 100644 index 00000000000..09f702ec6fe --- /dev/null +++ b/gremlin-driver/src/main/java/example/Example.java @@ -0,0 +1,157 @@ +/* +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 example; + +// Common imports +import org.apache.tinkerpop.gremlin.driver.MessageSerializer; +import org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; + +import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal; +import static org.apache.tinkerpop.gremlin.process.traversal.P.*; +import static org.apache.tinkerpop.gremlin.structure.T.*; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*; + +import org.apache.tinkerpop.gremlin.driver.Client; +import org.apache.tinkerpop.gremlin.driver.Cluster; +import org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.io.AbstractIoRegistry; +import org.apache.tinkerpop.gremlin.structure.io.IoRegistry; +import org.apache.tinkerpop.gremlin.structure.io.binary.TypeSerializerRegistry; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +public class Example { + + public static void main(String[] args) throws Exception { + connectionExample(); + basicGremlinExample(); + modernTraversalExample(); + } + + public static void connectionExample() throws Exception { + // Creating an embedded graph + Graph graph = TinkerGraph.open(); + GraphTraversalSource g = traversal().withEmbedded(graph); + + // Connecting to the server + g = traversal().withRemote(DriverRemoteConnection.using("localhost", 8182, "g")); + + // Connecting to the server with a configurations file + g = traversal().withRemote("gremlin-driver/src/main/java/example/conf/remote-graph.properties"); + + // Connecting and customizing configurations with a cluster + // See reference/#gremlin-java-configuration for full list of configurations + Cluster cluster = Cluster.build(). + channelizer("org.apache.tinkerpop.gremlin.driver.Channelizer$HttpChannelizer"). + keepAliveInterval(180000). + maxConnectionPoolSize(8). + path("/gremlin"). + port(8182). + serializer(new GraphBinaryMessageSerializerV1()). + create(); + g = traversal().withRemote(DriverRemoteConnection.using(cluster, "g")); + + // Connecting and specifying a serializer + IoRegistry registry = new FakeIoRegistry(); // an IoRegistry instance exposed by a specific graph provider + TypeSerializerRegistry typeSerializerRegistry = TypeSerializerRegistry.build().addRegistry(registry).create(); + MessageSerializer serializer = new GraphBinaryMessageSerializerV1(typeSerializerRegistry); + cluster = Cluster.build(). + serializer(serializer). + create(); + Client client = cluster.connect(); + g = traversal().withRemote(DriverRemoteConnection.using(client, "g")); + + // Cleanup + g.close(); + } + public static class FakeIoRegistry extends AbstractIoRegistry { + } + + private static void basicGremlinExample() { + Graph graph = TinkerGraph.open(); + GraphTraversalSource g = traversal().withEmbedded(graph); + + // Basic Gremlin: adding and retrieving data + Vertex v1 = g.addV("person").property("name","marko").next(); + Vertex v2 = g.addV("person").property("name","stephen").next(); + Vertex v3 = g.addV("person").property("name","vadas").next(); + + // Be sure to use a terminating step like next() or iterate() so that the traversal "executes" + // Iterate() does not return any data and is used to just generate side-effects (i.e. write data to the database) + g.V(v1).addE("knows").to(v2).property("weight",0.75).iterate(); + g.V(v1).addE("knows").to(v3).property("weight",0.75).iterate(); + + // Retrieve the data from the "marko" vertex + Object marko = g.V().has("person","name","marko").values("name").next(); + System.out.println("name: " + marko); + + // Find the "marko" vertex and then traverse to the people he "knows" and return their data + List peopleMarkoKnows = g.V().has("person","name","marko").out("knows").values("name").toList(); + for (Object person : peopleMarkoKnows) { + System.out.println("marko knows " + person); + } + } + + private static void modernTraversalExample() { + // Performs basic traversals on the Modern toy graph which can be created using TinkerFactory + Graph modern = TinkerFactory.createModern(); + GraphTraversalSource g = traversal().withEmbedded(modern); + + List e1 = g.V(1).bothE().toList(); // (1) + List e2 = g.V(1).bothE().where(otherV().hasId(2)).toList(); // (2) + Vertex v1 = g.V(1).next(); + Vertex v2 = g.V(2).next(); + List e3 = g.V(v1).bothE().where(otherV().is(v2)).toList(); // (3) + List e4 = g.V(v1).outE().where(inV().is(v2)).toList(); // (4) + List e5 = g.V(1).outE().where(inV().has(id, within(2,3))).toList(); // (5) + List e6 = g.V(1).out().where(in().hasId(6)).toList(); // (6) + + System.out.println("1: " + e1.toString()); + System.out.println("2: " + e2.toString()); + System.out.println("3: " + e3.toString()); + System.out.println("4: " + e4.toString()); + System.out.println("5: " + e5.toString()); + System.out.println("6: " + e6.toString()); + + /* + 1. There are three edges from the vertex with the identifier of "1". + 2. Filter those three edges using the where()-step using the identifier of the vertex returned by otherV() to + ensure it matches on the vertex of concern, which is the one with an identifier of "2". + 3. Note that the same traversal will work if there are actual Vertex instances rather than just vertex + identifiers. + 4. The vertex with identifier "1" has all outgoing edges, so it would also be acceptable to use the directional + steps of outE() and inV() since the schema allows it. + 5. There is also no problem with filtering the terminating side of the traversal on multiple vertices, in this + case, vertices with identifiers "2" and "3". + 6. There’s no reason why the same pattern of exclusion used for edges with where() can’t work for a vertex + between two vertices. + */ + } +} \ No newline at end of file diff --git a/gremlin-driver/src/main/java/example/conf/remote-graph.properties b/gremlin-driver/src/main/java/example/conf/remote-graph.properties new file mode 100644 index 00000000000..ea25901634b --- /dev/null +++ b/gremlin-driver/src/main/java/example/conf/remote-graph.properties @@ -0,0 +1,18 @@ +# 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. +gremlin.remote.remoteConnectionClass=org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection +gremlin.remote.driver.sourceName=g \ No newline at end of file diff --git a/gremlin-go/example/example.go b/gremlin-go/example/example.go index ab99ac2e1a1..a17d04c305f 100644 --- a/gremlin-go/example/example.go +++ b/gremlin-go/example/example.go @@ -21,7 +21,7 @@ package main import ( "fmt" - gremlingo "github.com/apache/tinkerpop/gremlin-go/driver" + "github.com/apache/tinkerpop/gremlin-go/v3/driver" ) @@ -29,30 +29,129 @@ import ( var __ = gremlingo.T__ var gt = gremlingo.P.Gt var order = gremlingo.Order +var T = gremlingo.T +var P = gremlingo.P func main() { - // Creating the connection to the server. - driverRemoteConnection, err := gremlingo.NewDriverRemoteConnection("ws://localhost:8182/gremlin", + connectionExample() + basicGremlinExample() + modernTraversalExample() +} + +func connectionExample() { + // Creating the connection to the server + driverRemoteConnection, err := gremlingo.NewDriverRemoteConnection("ws://localhost:8182/gremlin") + + // Connecting to the server with customized configurations + driverRemoteConnection, err = gremlingo.NewDriverRemoteConnection("ws://localhost:8182/gremlin", func(settings *gremlingo.DriverRemoteConnectionSettings) { - settings.TraversalSource = "gmodern" + settings.TraversalSource = "g" + settings.NewConnectionThreshold = 4 + settings.EnableCompression = false + settings.ReadBufferSize = 0 + settings.WriteBufferSize = 0 }) + + // Error handling if err != nil { fmt.Println(err) return } + // Cleanup defer driverRemoteConnection.Close() - // Creating graph traversal + // Creating the graph traversal + g := gremlingo.Traversal_().WithRemote(driverRemoteConnection) + fmt.Println(g) +} + +func basicGremlinExample() { + driverRemoteConnection, err := gremlingo.NewDriverRemoteConnection("ws://localhost:8182/gremlin") + if err != nil { + fmt.Println(err) + return + } + defer driverRemoteConnection.Close() g := gremlingo.Traversal_().WithRemote(driverRemoteConnection) - // Perform traversal - result, err := g.V().HasLabel("person").Has("age", __.Is(gt(28))).Order().By("age", order.Desc).Values("name").ToList() + // Basic Gremlin: adding and retrieving data + v1, err := g.AddV("person").Property("name", "marko").Next() + v2, err := g.AddV("person").Property("name", "stephen").Next() + v3, err := g.AddV("person").Property("name", "vadas").Next() + v1Vertex, err := v1.GetVertex() + v2Vertex, err := v2.GetVertex() + v3Vertex, err := v3.GetVertex() + + // Be sure to use a terminating step like next() or iterate() so that the traversal "executes" + // Iterate() does not return any data and is used to just generate side-effects (i.e. write data to the database) + promise := g.V(v1Vertex).AddE("knows").To(v2Vertex).Property("weight", 0.75).Iterate() + err = <-promise + if err != nil { + fmt.Println(err) + return + } + promise = g.V(v1Vertex).AddE("knows").To(v3Vertex).Property("weight", 0.75).Iterate() + err = <-promise if err != nil { fmt.Println(err) return } - for _, r := range result { - fmt.Println(r.GetString()) + + // Retrieve the data from the "marko" vertex + marko, err := g.V().Has("person", "name", "marko").Values("name").Next() + fmt.Println("name:", marko.GetString()) + + // Find the "marko" vertex and then traverse to the people he "knows" and return their data + peopleMarkoKnows, err := g.V().Has("person", "name", "marko").Out("knows").Values("name").ToList() + for _, person := range peopleMarkoKnows { + fmt.Println("marko knows", person.GetString()) + } +} + +func modernTraversalExample() { + driverRemoteConnection, err := gremlingo.NewDriverRemoteConnection("ws://localhost:8182/gremlin") + if err != nil { + fmt.Println(err) + return } + defer driverRemoteConnection.Close() + g := gremlingo.Traversal_().WithRemote(driverRemoteConnection) + + /* + This example requires the Modern toy graph to be preloaded upon launching the Gremlin server. + For details, see https://tinkerpop.apache.org/docs/current/reference/#gremlin-server-docker-image and use + conf/gremlin-server-modern.yaml. + */ + e1, err := g.V(1).BothE().ToList() // (1) + e2, err := g.V().BothE().Where(__.OtherV().HasId(2)).ToList() // (2) + v1, err := g.V(1).Next() + v2, err := g.V(2).Next() + v1Vertex, err := v1.GetVertex() + v2Vertex, err := v2.GetVertex() + e3, err := g.V(v1Vertex).BothE().Where(__.OtherV().Is(v2Vertex)).ToList() // (3) + e4, err := g.V(v1Vertex).OutE().Where(__.InV().Is(v2Vertex)).ToList() // (4) + e5, err := g.V(1).OutE().Where(__.InV().Has(T.Id, P.Within(2, 3))).ToList() // (5) + e6, err := g.V(1).Out().Where(__.In().HasId(6)).ToList() // (6) + + fmt.Println(e1) + fmt.Println(e2) + fmt.Println(e3) + fmt.Println(e4) + fmt.Println(e5) + fmt.Println(e6) + + /* + 1. There are three edges from the vertex with the identifier of "1". + 2. Filter those three edges using the Where()-step using the identifier of the vertex returned by OtherV() to + ensure it matches on the vertex of concern, which is the one with an identifier of "2". + 3. Note that the same traversal will work if there are actual Vertex instances rather than just vertex + identifiers. + 4. The vertex with identifier "1" has all outgoing edges, so it would also be acceptable to use the directional + steps of OutE() and InV() since the schema allows it. + 5. There is also no problem with filtering the terminating side of the traversal on multiple vertices, in this + case, vertices with identifiers "2" and "3". + 6. There’s no reason why the same pattern of exclusion used for edges with Where() can’t work for a vertex + between two vertices. + */ } diff --git a/gremlin-go/example/go.mod b/gremlin-go/example/go.mod index 75d6f1c487e..a58386ab0b1 100644 --- a/gremlin-go/example/go.mod +++ b/gremlin-go/example/go.mod @@ -19,11 +19,11 @@ module example go 1.20 -require github.com/apache/tinkerpop/gremlin-go/v3 v3.6.1-rc2 +require github.com/apache/tinkerpop/gremlin-go/v3 v3.6.5 require ( github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/websocket v1.4.2 // indirect - github.com/nicksnyder/go-i18n/v2 v2.1.2 // indirect - golang.org/x/text v0.3.7 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/nicksnyder/go-i18n/v2 v2.2.1 // indirect + golang.org/x/text v0.11.0 // indirect ) diff --git a/gremlin-go/example/go.sum b/gremlin-go/example/go.sum index 4a83d5aef46..2e48c0a8edd 100644 --- a/gremlin-go/example/go.sum +++ b/gremlin-go/example/go.sum @@ -1,315 +1,44 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/apache/tinkerpop/gremlin-go/v3 v3.6.1-rc2 h1:3lQ4NUwq+9FzljbOj9A4j0DtTJXHRWeyffk/fhNmR5w= -github.com/apache/tinkerpop/gremlin-go/v3 v3.6.1-rc2/go.mod h1:6LYD7pUNUiMEUTyAKDA30e2W2luaubMI667CgR2MGa0= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw= -github.com/cucumber/godog v0.12.5/go.mod h1:u6SD7IXC49dLpPN35kal0oYEjsXZWee4pW6Tm9t5pIc= -github.com/cucumber/messages-go/v16 v16.0.0/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= -github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU= +github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/apache/tinkerpop/gremlin-go/v3 v3.6.5 h1:JafEkhoITZ+0W9/U6uow7zWTqfdZwgFNPPzxM+53C+E= +github.com/apache/tinkerpop/gremlin-go/v3 v3.6.5/go.mod h1:yGalCq736URRMAzVMI6hrMMzaW/fsg4cwXfLRI7uhMw= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v1.3.0/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nicksnyder/go-i18n/v2 v2.1.2 h1:QHYxcUJnGHBaq7XbvgunmZ2Pn0focXFqTD61CkH146c= -github.com/nicksnyder/go-i18n/v2 v2.1.2/go.mod h1:d++QJC9ZVf7pa48qrsRWhMJ5pSHIPmS3OLqK1niyLxs= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/nicksnyder/go-i18n/v2 v2.2.1 h1:aOzRCdwsJuoExfZhoiXHy4bjruwCMdt5otbYojM/PaA= +github.com/nicksnyder/go-i18n/v2 v2.2.1/go.mod h1:fF2++lPHlo+/kPaj3nB0uxtPwzlPm+BlgwGX7MkeGj0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/gremlin-javascript/example/.gitignore b/gremlin-javascript/example/.gitignore new file mode 100644 index 00000000000..2ccbe4656c6 --- /dev/null +++ b/gremlin-javascript/example/.gitignore @@ -0,0 +1 @@ +/node_modules/ diff --git a/gremlin-javascript/example/example.js b/gremlin-javascript/example/example.js new file mode 100644 index 00000000000..151ed0de766 --- /dev/null +++ b/gremlin-javascript/example/example.js @@ -0,0 +1,146 @@ +/* +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. +*/ + +// Common imports as listed at reference/#gremlin-javascript-imports +const gremlin = require('gremlin'); +const traversal = gremlin.process.AnonymousTraversalSource.traversal; +const __ = gremlin.process.statics; +const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection; +const column = gremlin.process.column; +const direction = gremlin.process.direction; +const Direction = { + BOTH: direction.both, + IN: direction.in, + OUT: direction.out, + from_: direction.out, + to: direction.in, +} +const p = gremlin.process.P; +const textp = gremlin.process.TextP; +const pick = gremlin.process.pick; +const pop = gremlin.process.pop; +const order = gremlin.process.order; +const scope = gremlin.process.scope; +const t = gremlin.process.t; +const cardinality = gremlin.process.cardinality; +const CardinalityValue = gremlin.process.CardinalityValue; +const serializer = gremlin.structure.io.graphserializer; +const testing = Direction.to; + +async function main() { + await connectionExample(); + await basicGremlinExample(); + await modernTraversalExample(); +} + +async function connectionExample() { + // Connecting to the server + let dc = new DriverRemoteConnection('ws://localhost:8182/gremlin'); + let g = traversal().withRemote(dc); + + // Connecting and customizing configurations + dc = new DriverRemoteConnection('ws://localhost:8182/gremlin', { + mimeType: 'application/vnd.gremlin-v3.0+json', + reader: serializer, + writer: serializer, + rejectUnauthorized: false, + traversalSource: 'g', + }) + g = traversal().withRemote(dc); + + // Simple query to verify connection + const v = await g.addV().iterate(); + const count = await g.V().count().next(); + console.log(count.value); + + // Cleanup + await dc.close(); +} + +async function basicGremlinExample() { + let dc = new DriverRemoteConnection('ws://localhost:8182/gremlin'); + let g = traversal().withRemote(dc); + + // Basic Gremlin: adding and retrieving data + const v1 = await g.addV('person').property('name','marko').next(); + const v2 = await g.addV('person').property('name','stephen').next(); + const v3 = await g.addV('person').property('name','vadas').next(); + + + // Be sure to use a terminating step like next() or iterate() so that the traversal "executes" + // Iterate() does not return any data and is used to just generate side-effects (i.e. write data to the database) + await g.V(v1.value).addE('knows').to(v2.value).property('weight',0.75).iterate(); + await g.V(v1.value).addE('knows').to(v3.value).property('weight',0.75).iterate(); + + // Retrieve the data from the "marko" vertex + const marko = await g.V().has('person','name','marko').values('name').toList(); + console.log("name: " + marko[0]); + + // Find the "marko" vertex and then traverse to the people he "knows" and return their data + const peopleMarkoKnows = await g.V().has('person','name','marko').out('knows').values('name').toList(); + peopleMarkoKnows.forEach((person) => { + console.log("marko knows " + person); + }); + + await dc.close(); +} + +async function modernTraversalExample() { + /* + This example requires the Modern toy graph to be preloaded upon launching the Gremlin server. + For details, see https://tinkerpop.apache.org/docs/current/reference/#gremlin-server-docker-image and use + conf/gremlin-server-modern.yaml. + */ + let dc = new DriverRemoteConnection('ws://localhost:8182/gremlin'); + let g = traversal().withRemote(dc); + + e1 = await g.V(1).bothE().toList(); // (1) + e2 = await g.V(1).bothE().where(__.otherV().hasId(2)).toList(); // (2) + const v1 = await g.V(1).next(); + const v2 = await g.V(2).next(); + e3 = await g.V(v1.value).bothE().where(__.otherV().is(v2.value)).toList(); // (3) + e4 = await g.V(v1.value).outE().where(__.inV().is(v2.value)).toList(); // (4) + e5 = await g.V(1).outE().where(__.inV().has(t.id, p.within(2,3))).toList(); // (5) + e6 = await g.V(1).out().where(__.in_().hasId(6)).toList(); // (6) + + console.log("1: " + e1.toString()); + console.log("2: " + e2.toString()); + console.log("3: " + e3.toString()); + console.log("4: " + e4.toString()); + console.log("5: " + e5.toString()); + console.log("6: " + e6.toString()); + + /* + 1. There are three edges from the vertex with the identifier of "1". + 2. Filter those three edges using the where()-step using the identifier of the vertex returned by otherV() to + ensure it matches on the vertex of concern, which is the one with an identifier of "2". + 3. Note that the same traversal will work if there are actual Vertex instances rather than just vertex + identifiers. + 4. The vertex with identifier "1" has all outgoing edges, so it would also be acceptable to use the directional + steps of outE() and inV() since the schema allows it. + 5. There is also no problem with filtering the terminating side of the traversal on multiple vertices, in this + case, vertices with identifiers "2" and "3". + 6. There’s no reason why the same pattern of exclusion used for edges with where() can’t work for a vertex + between two vertices. + */ + + await dc.close(); +} + +main(); \ No newline at end of file diff --git a/gremlin-javascript/example/package-lock.json b/gremlin-javascript/example/package-lock.json new file mode 100644 index 00000000000..bbf18a277d4 --- /dev/null +++ b/gremlin-javascript/example/package-lock.json @@ -0,0 +1,47 @@ +{ + "name": "example", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "example", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "gremlin": "^3.7.0" + } + }, + "node_modules/gremlin": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/gremlin/-/gremlin-3.7.0.tgz", + "integrity": "sha512-LEjUtDEJB3ddij3VSb769b2TkLu29h30G+zrz/T9hyrnSouiOCzvgTHoMZq3wUig2O+oYLCgcPRw0iquBUoqnw==", + "dependencies": { + "ws": "^8.11.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ws": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/gremlin-javascript/example/package.json b/gremlin-javascript/example/package.json new file mode 100644 index 00000000000..05e0bebf832 --- /dev/null +++ b/gremlin-javascript/example/package.json @@ -0,0 +1,14 @@ +{ + "name": "example", + "version": "1.0.0", + "description": "GLV example for JavaScript with Node", + "main": "example.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Ryan Tan", + "license": "Apache-2.0", + "dependencies": { + "gremlin": "^3.7.0" + } +} diff --git a/gremlin-python/src/main/python/example.py b/gremlin-python/src/main/python/example.py deleted file mode 100644 index 64e0c0bfee1..00000000000 --- a/gremlin-python/src/main/python/example.py +++ /dev/null @@ -1,52 +0,0 @@ -# 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. - -from gremlin_python.process.anonymous_traversal import traversal -from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection -import json - - -to_string = json.dumps - - -def main(): - - # connect to a remote server that is compatible with the Gremlin Server protocol. for those who - # downloaded and are using Gremlin Server directly be sure that it is running locally with: - # - # bin/gremlin-server.sh console - # - # which starts it in "console" mode with an empty in-memory TinkerGraph ready to go bound to a - # variable named "g" as referenced in the following line. - g = traversal().with_remote(DriverRemoteConnection('ws://localhost:8182/gremlin', 'g')) - - # add some data - be sure to use a terminating step like iterate() so that the traversal - # "executes". iterate() does not return any data and is used to just generate side-effects - # (i.e. write data to the database) - g.add_v('person').property('name', 'marko').as_('m'). \ - add_v('person').property('name', 'vadas').as_('v'). \ - add_e('knows').from_('m').to('v').iterate() - - # retrieve the data from the "marko" vertex - print("marko: " + to_string(g.V().has('person', 'name', 'marko').value_map().next())) - - # find the "marko" vertex and then traverse to the people he "knows" and return their data - print("who marko knows: " + to_string(g.V().has('person', 'name', 'marko').out('knows').value_map().next())) - - -if __name__ == "__main__": - main() diff --git a/gremlin-python/src/main/python/example/example.py b/gremlin-python/src/main/python/example/example.py new file mode 100644 index 00000000000..57147514b30 --- /dev/null +++ b/gremlin-python/src/main/python/example/example.py @@ -0,0 +1,158 @@ +# 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. + +import ssl +from ssl import Purpose + +import sys + +sys.path.append("..") + +# Common imports +from gremlin_python import statics +from gremlin_python.process.anonymous_traversal import traversal +from gremlin_python.process.graph_traversal import __ +from gremlin_python.process.strategies import * +from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection +from gremlin_python.process.traversal import T +from gremlin_python.process.traversal import Order +from gremlin_python.process.traversal import Cardinality +from gremlin_python.process.traversal import Column +from gremlin_python.process.traversal import Direction +from gremlin_python.process.traversal import Operator +from gremlin_python.process.traversal import P +from gremlin_python.process.traversal import TextP +from gremlin_python.process.traversal import Pop +from gremlin_python.process.traversal import Scope +from gremlin_python.process.traversal import Barrier +from gremlin_python.process.traversal import Bindings +from gremlin_python.process.traversal import WithOptions + +from gremlin_python.driver.serializer import GraphBinarySerializersV1 +from gremlin_python.driver.protocol import GremlinServerWSProtocol +from gremlin_python.driver.aiohttp.transport import AiohttpTransport + +# Special type classes for more specific data types +from gremlin_python.statics import long # Java long +from gremlin_python.statics import timestamp # Java timestamp +from gremlin_python.statics import SingleByte # Java byte type +from gremlin_python.statics import SingleChar # Java char type +from gremlin_python.statics import GremlinType # Java Class + + +def main(): + connection_example() + basic_gremlin_example() + modern_traversal_example() + + +def connection_example(): + # connect to a remote server that is compatible with the Gremlin Server protocol. for those who + # downloaded and are using Gremlin Server directly be sure that it is running locally with: + # + # bin/gremlin-server.sh console + # + # which starts it in "console" mode with an empty in-memory TinkerGraph ready to go bound to a + # variable named "g" as referenced in the following line. + g = traversal().with_remote(DriverRemoteConnection('ws://localhost:8182/gremlin', 'g')) + + # connecting with plain text and Kerberos SASL authentication + rc = DriverRemoteConnection('ws://localhost:8182/gremlin', 'g', username='stephen', password='password') + g = traversal().with_remote(rc) + rc.close() + + rc = DriverRemoteConnection('ws://localhost:8182/gremlin', 'g', kerberized_service='gremlin@hostname.your.org') + g = traversal().with_remote(rc) + rc.close() + + # connecting with customized configurations + rc = DriverRemoteConnection( + 'ws://localhost:8182/gremlin', 'g', + username="", password="", kerberized_service='', + message_serializer=GraphBinarySerializersV1(), graphson_reader=None, + graphson_writer=None, headers=None, session=None, + enable_user_agent_on_connect=True + ) + g = traversal().with_remote(rc) + + # cleanup + rc.close() + + +def basic_gremlin_example(): + g = traversal().with_remote(DriverRemoteConnection('ws://localhost:8182/gremlin', 'g')) + + # basic Gremlin: adding and retrieving data + v1 = g.add_v('person').property('name', 'marko').next() + v2 = g.add_v('person').property('name', 'stephen').next() + v3 = g.add_v('person').property('name', 'vadas').next() + + # be sure to use a terminating step like next() or iterate() so that the traversal "executes" + # iterate() does not return any data and is used to just generate side-effects (i.e. write data to the database) + g.V(v1).add_e('knows').to(v2).property('weight', 0.75).iterate() + g.V(v1).add_e('knows').to(v3).property('weight', 0.75).iterate() + + # retrieve the data from the "marko" vertex + marko = g.V().has('person', 'name', 'marko').values('name').next() + print("name: " + marko) + + # find the "marko" vertex and then traverse to the people he "knows" and return their data + people_marko_knows = g.V().has('person', 'name', 'marko').out('knows').values('name').toList() + for person in people_marko_knows: + print("marko knows " + person) + + +def modern_traversal_example(): + # This example requires the Modern toy graph to be preloaded upon launching the Gremlin server. + # For details, see https://tinkerpop.apache.org/docs/current/reference/#gremlin-server-docker-image and use + # conf/gremlin-server-modern.yaml. + rc = DriverRemoteConnection('ws://localhost:8182/gremlin', 'g') + g = traversal().with_remote(rc) + + e1 = g.V(1).both_e().to_list() # (1) + e2 = g.V(1).both_e().where(__.other_v().has_id(2)).to_list() # (2) + v1 = g.V(1).next() + v2 = g.V(2).next() + e3 = g.V(v1).both_e().where(__.other_v().is_(v2)).to_list() # (3) + e4 = g.V(v1).out_e().where(__.in_v().is_(v2)).to_list() # (4) + e5 = g.V(1).out_e().where(__.in_v().has(T.id, P.within(2, 3))).to_list() # (5) + e6 = g.V(1).out().where(__.in_().has_id(6)).to_list() # (6) + + print("1: " + str(e1)) + print("2: " + str(e2)) + print("3: " + str(e3)) + print("4: " + str(e4)) + print("5: " + str(e5)) + print("6: " + str(e6)) + + # 1. There are three edges from the vertex with the identifier of "1". + # 2. Filter those three edges using the where()-step using the identifier of the vertex returned by other_v() to + # ensure it matches on the vertex of concern, which is the one with an identifier of "2". + # 3. Note that the same traversal will work if there are actual Vertex instances rather than just vertex + # identifiers. + # 4. The vertex with identifier "1" has all outgoing edges, so it would also be acceptable to use the directional + # steps of out_e() and in_v() since the schema allows it. + # 5. There is also no problem with filtering the terminating side of the traversal on multiple vertices, in this + # case, vertices with identifiers "2" and "3". + # 6. There’s no reason why the same pattern of exclusion used for edges with where() can’t work for a vertex + # between two vertices. + + rc.close() + + +if __name__ == "__main__": + main() diff --git a/gremlin-python/src/main/python/example/requirements.txt b/gremlin-python/src/main/python/example/requirements.txt new file mode 100644 index 00000000000..a13e7ceb59d --- /dev/null +++ b/gremlin-python/src/main/python/example/requirements.txt @@ -0,0 +1,29 @@ +# 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. + +-aenum==3.1.15 +aiohttp==3.8.0 +aiosignal==1.3.1 +async-timeout==4.0.3 +attrs==23.1.0 +charset-normalizer==2.1.1 +frozenlist==1.4.0 +idna==3.4 +isodate==0.6.1 +multidict==4.7.6 +six==1.15.0 +yarl==1.9.2 \ No newline at end of file