跳转到主要内容

Gremlin-Console

Gremlin-Console 是由 Tinkerpop 自己开发的一个交互式客户端,用户可以使用该客户端对 Graph 做各种操作,主要有两种使用模式:

  • 单机离线调用模式
  • Client/Server 请求模式

注:Gremlin-Console 只是便于用户快速上手体验,不建议在生产环境中使用。

1 单机离线调用模式

由于 lib 目录下已经包含了 HugeCore 的 jar 包,且 HugeGraph-Server 已经作为插件注册到 Gremlin-Console 中,用户可以直接写 Groovy 脚本调用 HugeGraph-Core 的代码,然后交由 Gremlin-Console 内的解析引擎执行,就能在不启动 Server 的情况下操作图。

这里提供一个示例,首先修改 hugegraph.properties 配置使用 Memory 后端 (使用其他后端可能会出现一些初始化问题):

1backend=memory
2serializer=text

然后输入下述命令:

 1> ./bin/gremlin-console.sh -- -i scripts/example.groovy
 2
 3         \,,,/
 4         (o o)
 5-----oOOo-(3)-oOOo-----
 6plugin activated: HugeGraph
 7plugin activated: tinkerpop.server
 8plugin activated: tinkerpop.utilities
 9plugin activated: tinkerpop.tinkergraph
10main dict load finished, time elapsed 644 ms
11model load finished, time elapsed 35 ms.
12>>>> query all vertices: size=6
13>>>> query all edges: size=6
14gremlin> 

这里的 -- 会被 getopts 解析为最后一个 option,这样后面的 options 就可以传入 Gremlin-Console 进行处理了。-i 代表 Execute the specified script and leave the console open on completion,更多的选项可以参考 Gremlin-Console 的源代码。

其中 example.groovy 是 scripts 目录下的一个示例脚本,该脚本插入了一些数据,并在最后查询图中顶点和边的数量。

此时还可以继续输入 Gremlin 语句对图进行操作:

 1gremlin> g.V()
 2==>v[2:lop]
 3==>v[1:josh]
 4==>v[1:marko]
 5==>v[1:peter]
 6==>v[1:vadas]
 7==>v[2:ripple]
 8gremlin> g.E()
 9==>e[S1:josh>2>>S2:lop][1:josh-created->2:lop]
10==>e[S1:josh>2>>S2:ripple][1:josh-created->2:ripple]
11==>e[S1:marko>1>>S1:josh][1:marko-knows->1:josh]
12==>e[S1:marko>1>>S1:vadas][1:marko-knows->1:vadas]
13==>e[S1:marko>2>>S2:lop][1:marko-created->2:lop]
14==>e[S1:peter>2>>S2:lop][1:peter-created->2:lop]
15gremlin> 

更多的 Gremlin 语句请参考 Tinkerpop 官网。

2 Client/Server 请求模式

Gremlin-Console 通过 WebSocket 连接 HugeGraph-Server。默认配置使用 WsAndHttpChannelizer,可同时处理 WebSocket 和 HTTP 请求,无需切换 Channelizer。

1# vim conf/gremlin-server.yaml
2# ......
3channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer
4# ......

确认 host、port 与 remote.yaml 一致,然后按照步骤启动 HugeGraph-Server。

下面进入 Gremlin-Console:

1> ./bin/gremlin-console.sh
2
3         \,,,/
4         (o o)
5-----oOOo-(3)-oOOo-----
6plugin activated: HugeGraph
7plugin activated: tinkerpop.server
8plugin activated: tinkerpop.utilities
9plugin activated: tinkerpop.tinkergraph

连接 Server,需在配置文件中指定连接参数,在 conf 目录下有一个默认的 remote.yaml:

 1# cat conf/remote.yaml
 2hosts: [localhost]
 3port: 8182
 4serializer: {
 5  className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
 6  config: {
 7    serializeResultToString: false,
 8    ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
 9  }
10}

如果 Server 开启了鉴权模式,需要在同一个文件中补上凭据:

1username: admin
2password: pa

conf 目录下还提供了 remote-objects.yaml 和 gremlin-driver-settings.yaml,它们使用相同的 host、port 和序列化器配置。

1gremlin> :remote connect tinkerpop.server conf/remote.yaml
2==>Configured localhost/127.0.0.1:8182

Server 端的图以图空间限定名绑定,因此图空间 DEFAULT 下的图 hugegraph 绑定名为 DEFAULT-hugegraph,其 traversal source 绑定名为 __g_DEFAULT-hugegraph。裸写 hugegraph 在 Server 端无法解析,而 DEFAULT-hugegraph 又不是合法的 Groovy 标识符,所以远程脚本需要通过别名访问 traversal source。如果启动 HugeGraph-Server 时预加载了示例图,查询方式如下:

1gremlin> import org.apache.tinkerpop.gremlin.driver.Cluster
2gremlin> cluster = Cluster.open('conf/remote.yaml')
3gremlin> client = cluster.connect().alias(['g': '__g_DEFAULT-hugegraph'])
4gremlin> client.submit('g.V().count()').all().get()[0].object
5==>6
6gremlin> client.submit('g.V().toList().size()').all().get()[0].object
7==>6
8gremlin> client.close(); cluster.close()

注意:在 Client/Server 模式下,所有和 Server 有关的操作都要加上 :> ,如果不加,表示在 console 本地操作。:> 发送的脚本不带别名,因此只能使用 Server 自身已绑定的名称。

更多关于 Gremlin-Console 的使用,请参考 Tinkerpop 官网。