本文介绍如何基于Go语言编程环境连接和操作图数据库GDB,这也是以常驻服务形式操作图数据库GDB的常用形式。

注意
  • 以下示例的正确运行依赖您的运行环境网络与图数据库GDB实例联通
  • 运行环境需要安装有Go语言环境,推荐使用1.12版本,这也是本文示例使用的版本。

环境准备

  1. 安装go语言环境,Linux环境可以直接安装二进制包
  2. 安装GDB SDK。
    go get -u github.com/aliyun/alibabacloud-gdb-go-sdk/gdbclient
  3. 获取图数据库GDB连接参数。

    实例管理>基本信息页面,可以查看实例内网地址和内网端口,如果开通外网访问实例,也可以使用外网地址和外网端口。

    # 内网环境
    host = "${gdbID}.graphdb.rds.aliyuncs.com"
    port = 8182
    # 外网环境
    host = "${gdbID}pub.graphdb.rds.aliyuncs.com"
    port = 3734
    注意 确保运行环境在实例白名单配置的可访问范围内。

    实例管理>账号管理页面,可以查询实例账号信息,如果忘记密码,请点击重置密码按钮。

示例程序

上述GDB SDK中包含有演示程序,以下代码来自其中的演示程序。

  1. 新建一个demo目录,并添加测试文件。
    mkdir gdb_go_demo
    cd gdb_go_demo
    touch main.go
  2. 编写测试代码,运行以下代码时需要图数据库GDB的连接参数,直接以参数提供。
    package main
    import (
        "flag"
        "log"
        goClient "github.com/aliyun/alibabacloud-gdb-go-sdk/gdbclient"
    )
    var (
        host, username, password string
        port                     int
    )
    func main() {
        flag.StringVar(&host, "host", "", "GDB Connection Host")
        flag.StringVar(&username, "username", "", "GDB username")
        flag.StringVar(&password, "password", "", "GDB password")
        flag.IntVar(&port, "port", 8182, "GDB Connection Port")
        flag.Parse()
        if host == "" || username == "" || password == "" {
            log.Fatal("No enough args provided. Please run:" +
                " go run main.go -host <gdb host> -username <username> -password <password> -port <gdb port>")
            return
        }
        settings := &goClient.Settings{
            Host:     host,
            Port:     port,
            Username: username,
            Password: password,
        }
        // connect GDB with auth
        client := goClient.NewClient(settings)
        // send script dsl with bindings to GDB
        bindings := make(map[string]interface{})
        bindings["GDB___id"] = "gdb_vertex_test_id"
        bindings["GDB___label"] = "gdb_vertex_test_label"
        bindings["GDB___PK"] = "name"
        bindings["GDB___PV"] = "Jack"
        dsl := "g.addV(GDB___label).property(id, GDB___id).property(GDB___PK, GDB___PV)"
        results, err := client.SubmitScriptBound(dsl, bindings)
        if err != nil {
            log.Fatalf("Error while querying: %s\n", err.Error())
        }
        // get response, add vertex should return a Vertex
        for _, result := range results {
            v := result.GetVertex()
            log.Printf("get vertex[id:%s, label:%s, propLen %d", v.Id(), v.Label(), len(v.Properties()))
            // read vertex property
            for _, p := range v.VProperties() {
                log.Printf(" {PK: %s, PV: %s}", p.PKey(), p.PValue().(string))
            }
        }
        // drop all vertex
        _, err = client.SubmitScript("g.V().drop()")
        if err != nil {
            log.Fatalf("Error while querying: %s\n", err.Error())
        }
        client.Close()
    }

    上述代码实现创建连接GDB的client,并发送gremlin操作添加一个点,打印执行结果,最后发送清除所有数据的gremlin操作。针对client更多的参数配置请参考SDK包中的演示代码,包括连接池,session的支持等。

运行测试程序

将上一节中的GDB连接参数替换下面命令行参数,运行测试代码,正常会有下面输出。

go run main.go -host ${host} -port ${port} -username ${username} -password ${username}
2019/12/23 14:22:49 get vertex[id:gdb_vertex_test_id, label:gdb_vertex_test_label, propLen 1
2019/12/23 14:22:49  {PK: name, PV: Jack}

关于GDB GO SDK

  • GDB的GO语言SDK是阿里GDB团队开发维护的Gremlin客户端,欢迎使用和提交MR。
  • GO SDK目前不支持bytecode方式与GDB交互,用户可以使用script方式访问GDB,并将可变参数模版化,这也是GDB推荐的使用方式。
  • GO SDK封装有session接口,支持在一次事务中包含多次对GDB更新的操作,保证所有操作都成功或失败,不会出现部分更新的情况。