本文介绍如何基于Node.js编程环境连接和操作图数据库GDB。

注意
  • 进行以下操作时请确保图数据库GDB实例与您运行环境网络联通。
  • 确保运行环境已经安装有Node.js,且版本不低于8.11。

环境准备

  1. 安装Node.js,版本8.11或更高版本,Linux环境可以直接安装二进制包
  2. 安装gremlin-javascript程序包。
    npm install gremlin
  3. 获取图数据库GDB连接参数。

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

# 内网环境
endpoint = "${gdbID}.graphdb.rds.aliyuncs.com:8182"
# 外网环境
endpoint = "${gdbID}pub.graphdb.rds.aliyuncs.com:3734"
注意 确保运行环境在实例白名单配置的可访问范围内。
实例管理>账号管理页面,可以查询实例账号信息,如果忘记密码,请点击重置密码
cusername="${username}"
password="${password}"

示例代码

  1. 新建一个demo目录,并添加测试文件。
    mkdir gdb_demo
    cd gdb_demo
    touch demo.js
  2. 编写测试代码,将代码中指定的your-nameyour-passwordyour-endpoint替换为您实例的账号、密码、和域名。
    "use strict";
    const gremlin = require('gremlin');
    const authenticator = new gremlin.driver.auth.PlainTextSaslAuthenticator('your-username', 'your-password');
    const client = new gremlin.driver.Client(
        'ws://your-endpoint/gremlin',
        {authenticator}
    );
    function countVertices()
    {
        console.log('Running Vertex Count');
        return client.submit("g.V().count()", { })
            .then((result) => {
                console.log("Vertex Count Result: %s\n", JSON.stringify(result));
            });
    }
    function addVertex1()
    {
        console.log('Running Add Vertex 1');
        return client.submit("g.addV(GDB___label).property(id, GDB___id).property(GDB___pk, GDB___pv)",{
            GDB___id: "gdb_vertex_test_id_1",
            GDB___label: "gdb_vertex_test_label",
            GDB___pk: "name",
            GDB___pv: "Jack"
        }).then(data => {
            console.log("Add Vertex 1 Result: %s\n", JSON.stringify(data));
        });
    }
    function addVertex2()
    {
        console.log('Running Add Vertex 2');
        return client.submit("g.addV(GDB___label).property(id, GDB___id).property(GDB___pk, GDB___pv)",{
            GDB___id: "gdb_vertex_test_id_2",
            GDB___label: "gdb_vertex_test_label",
            GDB___pk: "name",
            GDB___pv: "Lucy"
        }).then(data => {
            console.log("Add Vertex 2 Result: %s\n", JSON.stringify(data));
        });
    }
    function addEdge()
    {
        console.log('Running Add Edge');
        return client.submit("g.addE(GDB___label).from(V(GDB___from)).to(V(GDB___to)).property(id, GDB___id).property(GDB___pk, GDB___pv)",{
            GDB___id: "gdb_edge_test_id",
            GDB___label: "gdb_edge_test_label",
            GDB___from: "gdb_vertex_test_id_1",
            GDB___to: "gdb_vertex_test_id_2",
            GDB___pk: "relation",
            GDB___pv: "lover"
        }).then(data => {
            console.log("Add Edge Result: %s\n", JSON.stringify(data));
        });
    }
    function dropVertices()
    {
        console.log('Running Drop');
        return client.submit('g.V().drop()', { })
            .then((result) => {
                console.log("Drop Result: %s\n", JSON.stringify(result));
            });
    }
    client.open()
        .then(countVertices)
        .then(addVertex1)
        .then(addVertex2)
        .then(addEdge)
        .then(dropVertices)
        .catch((error) => {
            console.error("Error running query...");
            console.error(error);
        }).then((res) => {
            client.close()
            console.log("Finished, Press any key to exit")
            process.stdin.resume();
            process.stdin.on('data', process.exit.bind(process, 0));
        }).catch((err) => {
            console.error("Fatal error:", err);
        });

    上述代码使用图数据库GDB连接参数新建访问client,然后查询点数量,再添加两个点和一个边,接着删除所有点,最后等待用户键入退出。

    注意 使用script方式交互时,最好将DSL中可变参数模版化,对性能提升有显著帮助。
  3. 复制上述代码到demo.js,运行测试程序。
    # 安装gremlin依赖到测试工程目录
    npm install gremlin
    # 运行测试程序
    node demo.js
  4. 连接新创建的图数据库GDB实例,以下是测试程序的输出。
    Running Vertex Count
    Vertex Count Result: {"_items":[0],"attributes":{},"length":1}
    Running Add Vertex 1
    Add Vertex 1 Result: {"_items":[{"id":"gdb_vertex_test_id_1","label":"gdb_vertex_test_label","properties":{"name":[{"id":"gdb_vertex_test_id_1","label":"name","value":"Jack","key":"name"}]}}],"attributes":{},"length":1}
    Running Add Vertex 2
    Add Vertex 2 Result: {"_items":[{"id":"gdb_vertex_test_id_2","label":"gdb_vertex_test_label","properties":{"name":[{"id":"gdb_vertex_test_id_2","label":"name","value":"Lucy","key":"name"}]}}],"attributes":{},"length":1}
    Running Add Edge
    Add Edge Result: {"_items":[{"id":"gdb_edge_test_id","label":"gdb_edge_test_label","outV":"gdb_vertex_test_id_1","inV":"gdb_vertex_test_id_2","properties":{"relation":"lover"}}],"attributes":{},"length":1}
    Running Drop
    Drop Result: {"_items":[],"attributes":{},"length":0}
    Finished, Press any key to exit

使用bytecode方式访问图数据库GDB

除上述script方式与图数据库GDB交互外,您也可以使用bytecode方式与GDB交互,以下直接给出与上一节相同功能的代码,您可以直接用相同方法运行查看执行结果。

同样您也需要替换图数据库GDB实例对连接参数到下面代码中。

"use strict";
const gremlin = require('gremlin');
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;
const Graph = gremlin.structure.Graph;
const __ = gremlin.process.statics;
const t = gremlin.process.t;
const authenticator = new gremlin.driver.auth.PlainTextSaslAuthenticator('your-username', 'your-password');
const graph = new Graph();
const g = graph.traversal().withRemote(
    new DriverRemoteConnection(
        'ws://your-endpoint/gremlin',
        {authenticator}
    ));
function vertexCount()
{
    console.log('Running Vertex Count');
    return g.V().count().next().
        then(data => {
            console.log("Vertex Count Result: %s", JSON.stringify(data));
        });
}
function addVertex1()
{
    console.log('Running Add Vertex 1');
    return g.addV('gdb_vertex_test_label')
        .property(t.id, 'gdb_vertex_test_id_1')
        .property('name','Jack').toList()
        .then(data => {
            console.log("Add Vertex 1 Result: %s", JSON.stringify(data));
        });
}
function addVertex2()
{
    console.log('Running Add Vertex 2');
    return g.addV('gdb_vertex_test_label')
        .property(t.id, 'gdb_vertex_test_id_2')
        .property('name','Lucy').toList()
        .then(data => {
            console.log("Add Vertex 2 Result: %s", JSON.stringify(data));
        });
}
function addEdge()
{
    console.log('Running Add Edge');
    return g.addE('gdb_edge_test_label')
        .from_(__.V('gdb_vertex_test_id_1'))
        .to(__.V('gdb_vertex_test_id_2'))
        .property(t.id, 'gdb_edge_test_id')
        .property('relation','lover').toList()
        .then(data => {
            console.log("Add Edge Result: %s", JSON.stringify(data));
        });
}
function dropVertex()
{
    console.log('Running Drop');
    return g.V().drop().iterate();
}
function finish()
{
    console.log("Finished, Press any key to exit")
    process.stdin.resume();
    process.stdin.on('data', process.exit.bind(process, 0));
}
async function allTasks()
{
  await vertexCount();
  await addVertex1();
  await addVertex2();
  await addEdge();
  await dropVertex();
  await finish();
}
allTasks();

以上示例使用顺序串行的方式依次完成点数量查询,添加两个点和一个边,再删除所有数据,最后等待用户键入退出。示例只是演示scriptbytecode完成相同功能的代码片段,同时也推荐您在异步事件中嵌入GDB的操作代码。

注意 使用bytecode方式需要在DSL末尾添加一个终结符

最佳实践

  • GDB支持scriptbytecode两种方式访问,但更推荐使用script方式。
  • 使用script方式访问GDB时,最好将DSL中可变参数模版化,可以获得较好的性能。