RESTful API Legacy

此文档主要介绍 TuGrpah 的 Rest API 的调用详情。

1.简介

TuGraph 提供遵从 REST 规范的 HTTP API,以供开发者通过 HTTP 请求远程调用 TuGraph 提供的服务。

本文档描述 TuGraph 的 HTTP API 使用方式。

注意:除”登陆”、”查询”和”存储过程”外,其余接口自 2023年4月30日 起将不再提供支持,统一使用Cypher接口提供服务。

2.请求与数据格式

2.1请求

TuGraph 支持 HTTP GET/POST/PUT/DELETE 请求。其中:

  • GET 请求用于只读请求,如读取点属性,边属性等操作;

  • POST 请求用于创建实体,提交 Cypher,以及加载和调用存储过程;

  • PUT 请求用于修改已有实体,如修改点属性,边属性等;

  • DELETE 请求用于删除已有实体,如删除点,边等。

在高可用模式下,用户可以在请求的报头(request header)中设置 server_version 来保证请求的服务器有足够新的数据。 当前的 server_version 可以从服务器返回的报头中获取。

2.2.数据格式

客户端与服务端数据交互的格式是 JSON。在发送请求时,请将发送数据的请求的报头设置为 Accept:application/json, Content-Type:application/json。 例如在创建一个点时,请求报头包含以下内容:

    Accept: application/json; charset=UTF-8
    Content-Type: application/json
    server_version: 12

2.3.返回值

TuGraph 返回的 HTTP 状态码包含以下四种:

  • 200 OK: 操作成功

  • 307 Temporary Redirect: 操作被重定向,一般用于高可用模式下,把操作重定向到 master 上

  • 400 Bad Request: 输入有误,例如 URI 错误,或者请求中的 JSON 参数错误

  • 500 Internal Server Error: 服务器端错误

当操作成功时,返回的 JSON 中包含操作的返回值。当操作重定向时,返回的 HTTP 报头中的 location 域包含重定向目的地址。 当发生输入错误或者服务器错误时,返回的 JSON 中包含 error_message 域,其内容是错误提示。

在高可用模式下,服务器还会在报头中设置 server_version,以告知客户端当前服务器的数据版本号。当客户端在不同的服务器之间切换时,该数据版本号可以保证客户端不会读到错误的历史数据。

2.4.URI格式

TuGraph REST API 提供以下功能:Service Root, login, info, label, index, node, relationship, cypher, cpp_plugin, 以及 python_plugin。 各功能使用的 URI 格式如下:

URI

说明

/web

web 可视化界面

/cypher

cypher 请求

/acl

权限控制

/user

用户管理

/login

用户登录

/info

数据库状态及提示信息

/task

任务管理

/db

子图操作

其中子图操作又分为:

URI

说明

/db

子图的创建,删除

/db/{graph_name}/node

点操作

/db/{graph_name}/relationship

边操作

/db/{graph_name}/label

Label 相关操作

/db/{graph_name}/index

索引相关操作

/db/{graph_name}/cypher

子图相关 cypher 操作

/db/{graph_name}/cpp_plugin

C++存储过程

/db/{graph_name}/python_plugin

Python 存储过程

/db/{graph_name}/import

在线导入

/db/{graph_name}/misc

其它操作

3.登录

TuGraph 提供基于 JWT 的用户认证方式,可以使用 HTTP 或 HTTPS 协议进行传输。系统默认使用 HTTP 协议,如果需要使用 HTTPS,需要在 lgraph.json 配置文件中将 ssl_auth 设为 1。

3.1.登录

用户通过用户名和密码发送登录请求。登录成功会收到带有签名的令牌(Json Web Token)和判断是否为默认密码的布尔型变量,客户端储存该令牌,并且用于以后的每次发送请求。如果登录失败会收到“Authentication failed”错误。

  • URI: /login

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    user

    用户名

    字符串

    password

    密码

    字符串

  • RESPONSE:

    域名

    说明

    类型

    jwt

    令牌

    字符串

    default_password

    是否为默认密码

    布尔值

Example request.

    • POST http://localhost:7070/login
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
      "user":"admin",
      "password":"73@TuGraph"
    }

Example response.

    • 200: OK
    Output:
    {
        "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek",
        "default_password": true
    }

3.2.身份刷新

Token失效后,前端发起刷新token接口,后端验证token合法性。初次登录后,1小时内有效,需刷新使用。即使刷新,24小时后也会强制退出,需要重新登陆。 验证通过,生成新的token;验证失败返回状态码401。

  • URI: /refresh

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    Authorization

    令牌

    字符串

  • RESPONSE:

    域名

    说明

    类型

    jwt

    令牌

    字符串

Example request.

    • POST http://localhost:7070/refresh
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
        "Authorization": "Bearer eyJhbGciOiJIUz32NiIsInR5cCI6IkpXVDJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byj3fYVAH4D88dfTD_zYQ_uAvdizTMek"
    }

Example response.

    • 200: OK
    Output:
    {
        "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek"
    }

3.3.修改Token有效期

修改Token有效期,需要传输jwt,refresh_time和expire_time三个参数,其中jwt用于校验用户身份,refresh_time和expire_time等于0时,有效期为无期限,超过refresh_time时,需要调用refresh接口获取新的Token;超过expire_time时,需要重新登录。

  • URI: /update_token_time

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    Authorization

    令牌

    字符串

    refresh_time

    有效时间(默认设置为0)

    Int64

    expire_time

    有效时间(默认设置为0)

    Int64

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/update_token_time
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
        "Authorization" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmbWEuYWkiLCJwYXNzd29yZCI6IjczQFR1R3JhcGgiLCJ1c2VyIjoiYWRtaW4ifQ.o_yb5veSJkuy-ieBp4MqTk-tC1grcKotgVbgNJ0TyTU",
        "refresh_time":0,
        "expire_time":0
    }

Example response.

    • 200: OK

3.4.查询Token有效期

查询Token有效期,需要传输jwt,用于校验用户身份,返回,refresh_time和expire_time,其中refresh_time表示刷新时间,超过时需要调用refresh接口获取新的Token;expire_time表示过期时间,超过时需要重新登录。

  • URI: /get_token_time

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    Authorization

    令牌

    字符串

  • RESPONSE: 如果成功,返回”refresh_time”和”expire_time”。

Example request.

    • POST http://localhost:7070/get_token_time
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
        "Authorization" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmbWEuYWkiLCJwYXNzd29yZCI6IjczQFR1R3JhcGgiLCJ1c2VyIjoiYWRtaW4ifQ.o_yb5veSJkuy-ieBp4MqTk-tC1grcKotgVbgNJ0TyTU",
    }

Example response.

    • 200: OK
    Output:
    {
        "refresh_time":600,
        "expire_time":3600
    }

3.5.登出

用户登出,同时删除token。

  • URI: /logout

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    Authorization

    令牌

    字符串

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/logout
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
        "Authorization" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmbWEuYWkiLCJwYXNzd29yZCI6IjczQFR1R3JhcGgiLCJ1c2VyIjoiYWRtaW4ifQ.o_yb5veSJkuy-ieBp4MqTk-tC1grcKotgVbgNJ0TyTU"
    }

Example response.

    • 200: OK

4.查询

URI 格式为

    http://{host}:{port}/cypher

4.1.调用Cypher

  • URI: /cypher

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    graph

    数据库

    字符串

    cypher

    查询语句

    字符串

  • RESPONSE:

    域名

    说明

    类型

    result

    运行结果

    列表

    elapsed

    运行时间(秒)

    浮点数

    header

    返回结果的表头

    列表

    size

    结果数

    整型

其中 header 是一个列表,每一元素格式如下:

域名

说明

类型

name

列名

字符串

type

列数据类型,0 为标量,1 为点 id,2 为向量

Example request.

    • POST http://localhost:7070/cypher
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
        "graph": "default",
        "script": "MATCH (n) RETURN n,n.name LIMIT 10"
    }

Example response.

    • 200: OK
    Output:
    {
        "elapsed": 0.001224517822265625,
        "header": [
            {
                "name": "n",
                "type": 1
            },
            {
                "name": "n.name",
                "type": 0
            }
        ]
        "result": [
            [
                0,
                "Rachel Kempson"
            ],
            [
                1,
                "Michael Redgrave"
            ],
            [
                2,
                "Vanessa Redgrave"
            ]
        ],
        "size": 3
    }

4.2.调用带参数的 Cypher

Cypher 支持使用参数进行查询。当调用带参数的 Cypher 查询时,TuGraph 会缓存该查询的 执行计划(execution plan),以加速后续同类查询的速度。

  • URI: /cypher

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    graph

    数据库

    字符串

    cypher

    查询语句

    字符串

    parameters

    参数

    列表

  • RESPONSE:

调用 Cypher 相同。

Example request.

    • POST http://localhost:7070/db/graph1/cypher
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
      "graph": "default",
      "script": "MATCH (n:Person {name:$param1}) RETURN n.birthyear",
      "parameters": {
        "$param1": "Lindsay Lohan"
      }
    }

Example response.

    • 200: OK
    Output:
    {
        "elapsed": 0.005886077880859375,
        "header": [
            {
                "name": "n.birthyear",
                "type": 0
            }
        ],
        "result": [
            [
                1986
            ]
        ],
        "size": 1
    }

5.存储过程

URI 格式为

    http://{host}:{port}/db/{graph_name}/cpp_plugin|python_plugin

5.1.加载存储过程

TuGraph 服务启动时,如果 load_plugins 为真,则会自动加载 plugin 目录下的所有 plugin。否则需要手动加载。此外,如果服务器运行过程中,管理员更新了 plugin 文件,也需要手动重新加载。重新加载 plugin 的调用格式为:

  • URI: /db/{graph_name}/cpp_plugin|python_plugin

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    name

    插件名称

    字符串

    description

    插件说明

    字符串

    code_base64

    插件代码

    字符串,使用 base64 编码

    read_only

    是否为只读存储过程

    布尔值

    code_type

    上传代码的类型,C++类型可选 zip/so/cpp,Python 为 py

    字符串

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/db/graph1/cpp_plugin
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
        "name" : "echo",
        "description" : "A test plugin that returns the input",
        "code_base64" : "{base64 encoded echo.zip}",
        "read_only" : true,
        "code_type" : "zip"
    }

Example response.

    • 200: OK

5.2.列出所有存储过程

  • URI: /db/{graph_name}/cpp_plugin|python_plugin

  • METHOD: GET

  • RESPONSE: 存储过程列表,其中每个元素是一个 plugin 的描述,其格式为:

    域名

    说明

    类型

    name

    存储过程名

    字符串

    description

    存储过程描述

    字符串

    read_only

    存储过程是否只读

    布尔值

Example request.

    • GET http://localhost:7070/db/graph1/cpp_plugin
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    Output:
    {
        [
            {
                "description":"adds a vertex label to the db",
                "name":"add_label",
                "read_only":false
            },
            {
                "description": "scans graph and get number of edges",
                "name": "scan_graph",
                "read_only": true
            }
        ]
    }

5.3.获取存储过程的详细信息

  • URI: /db/{graph_name}/cpp_plugin|python_plugin/{plugin_name}

  • METHOD: GET

  • RESPONSE: 存储过程信息,包括代码,其格式为:

    域名

    说明

    类型

    name

    存储过程名

    字符串

    description

    存储过程描述

    字符串

    read_only

    存储过程是否只读

    布尔值

    code_base64

    存储过程的代码

    字符串,使用 base64 编码

    code_type

    上传代码的类型,C++类型可选 zip/so/cpp,Python 为 py

    字符串

Example request.

    • GET http://localhost:7070/db/graph1/cpp_plugin/echo
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    Output:
    {
        "name" : "echo",
        "description" : "A test plugin that returns the input",
        "code_base64" : "{base64 encoded echo.zip}",
        "read_only" : true,
        "code_type" : "zip"
    }

5.4.调用存储过程

  • URI: /db/{graph_name}/cpp_plugin|python_plugin/{plugin_name}

  • METHOD: POST

  • REQUEST: 字符串输入

    域名

    说明

    类型

    data

    输入数据

    字符串

    timeout

    超时长度(秒,可选,缺省值为 0)

    浮点

    in_process

    是否在本进程调用(可选,缺省值为 false)

    布尔值

  • RESPONSE:

    域名

    说明

    类型

    result

    运行结果

    字符串

Example request.

    • POST http://localhost:7070/db/graph1/python_plugin/echo
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
        data : "Hello!\n你好!\nKonichiwa!",
        timeout : 0,
        in_process : true
    }

Example response.

    • 200: OK
    Output:
    {
      "result": "Hello!\n你好!\nKonichiwa!"
    }

5.5.删除存储过程

  • URI: /db/{graph_name}/cpp_plugin|python_plugin/{plugin_name}

  • METHOD: DELETE

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • DELETE http://localhost:7070/db/graph1/cpp_plugin/example_plugin
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK

6.Deprecated

以下接口将在4/30/2023之后被删除。

6.1.用户管理

系统默认创建一个管理员,管理员用户名为 admin,密码为 73@TuGraph。为了安全起见,请用户在第一次启动服务器后更改密码。

6.1.1.添加用户

添加一个新的用户,并为其设置初始密码。只有管理员有权限进行此操作。其中用户名只能由字母,数字以及下划线构成,密码则可以包含任意字符。用户名和密码长度不能超过 64 字节。添加用户时还可以为用户增加一个描述,用户描述可以包含任意字符,最长不超过 512 字节。

新用户默认拥有同名的角色,不具备任何图的权限。

  • URI: /user

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    user

    用户名

    字符串

    password

    密码

    字符串

    description

    用户描述

    字符串

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/user
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek
    Input:
    {
        "user": "USER1",
        "password": "AN_INITIAL_PASSWORD",
        "description": "This is a user"
    }

Example response.

    • 200: OK

6.1.2.列出所有用户

列出数据库的所有用户。只有管理员拥有该操作权限。

  • URI: /user/

  • METHOD: GET

  • RESPONSE: 所有用户及其信息。

Example request.

    • GET http://localhost:7070/user
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

• 200: OK
Output:
{
    "admin": {
        "disabled": false,
        "description": "Builtin admin user",
        "roles": ["admin"]
    },
    "guest1": {
        "disabled": true,
        "description": "",
        "roles": ["guest1", "some_other_role"]
    }
}

6.1.3.获取用户信息

列出给定用户的信息。

  • URI: /user/{user_name}

  • METHOD: GET

  • RESPONSE: 用户信息。

Example request.

    • GET http://localhost:7070/user/guest1
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

• 200: OK
Output:
{
    "disabled": true,
    "description": "A guest user"
    "roles": ["guest1", "some_other_role"]
}

6.1.4.列出用户权限

列出给定用户有权限访问的所有图及相应权限。

  • URI: /user/{user_name}/graph

  • METHOD: GET

  • RESPONSE: 用户信息。

Example request.

    • GET http://localhost:7070/user/guest1/graph
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

• 200: OK
Output:
{
    "graph1" : "FULL",
    "graph2" : "READ"
}

6.1.5.更改用户密码

用户可以更改自己的密码,更改密码时需要同时提供原密码。管理员可以更改所有用户的密码。管理员更改其它用户密码时,可以不提供当前密码。

  • URI: /user/{user_name}/password

  • METHOD: PUT

  • REQUEST:

    域名

    说明

    类型

    current_password

    当前密码

    字符串

    new_password

    新密码

    字符串

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/user/user1/password
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek
    Input:
    {
        "current_password": "THE_CURRENT_PASSWORD"
        "new_password": "A_NEW_PASSWORD"
    }

Example response.

    • 200: OK

6.1.6.修改用户描述

用户可以修改自己的描述。管理员可以修改任意用户的描述。

  • URI: /user/{user_name}/description

  • METHOD: PUT

  • REQUEST:

    域名

    说明

    类型

    description

    用户描述

    字符串

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/user/user1/description
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek
    Input:
    {
        "description": "New description for this user."
    }

Example response.

    • 200: OK

6.1.7.删除用户

删除用户及其所有相关权限,只有管理员拥有该操作权限。

  • URI: /user/{user_name}

  • METHOD: DELETE

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • DELETE http://localhost:7070/user/guest1
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

    • 200: OK

6.1.8.禁用用户

用户可以被禁用。被禁用的用户将不能登陆,但是其资料仍然保存。被禁用的用户可以被重新启用。

  • URI: /user/{user_name}/disable

  • METHOD: POST

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/user/guest1/disable
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

    • 200: OK

6.1.9.启用用户

启用一个被禁用的用户。

  • URI: /user/{user_name}/enable

  • METHOD: POST

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/user/guest1/enable
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

    • 200: OK

6.1.10.设置用户角色

为指定用户设置角色。只有管理员可以执行此操作。

用户角色列表必须是“全量列表”,即该列表需要包含该用户需要的所有角色。唯一的例外是用户的同名角色,即使列表中不含该角色,它也会被加到用户角色中。

  • URI: /user/{user_name}/role

  • METHOD: POST

  • REQUEST: 角色列表

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/user/guest1
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek
    Input:
        ["role1", "role2"]

Example response.

    • 200: OK

此时用户guest1拥有角色guest1, role1role2

6.2.角色管理

TuGraph 使用基于角色的权限管理。

同一用户可以拥有多个角色。新用户默认拥有与其同名的角色。删除用户时,同名角色也会被删除。如果新建用户时同名角色已经存在,则创建失败。

同一角色可以对多个图有不同的权限。用户对某张图的权限由其所有角色对该图的最高权限决定。

TuGraph 使用四级权限,不用的用户对不同的子图可以有不同的权限,四种权限及其说明如下:

权限

说明

NONE

无权限

READ

只读

WRITE

可读写子图中的点和边

FULL

完全权限,包括更改元数据(label, index),管理存储过程,以及删除子图中的所有数据

管理员对所有子图都有完全权限,新建的用户对所有子图都没有权限。将用户加入管理员角色中可以将用户提升为管理员。

6.2.1.添加角色

添加一个新的角色,并设置其描述。只有管理员有权限进行此操作。

角色名只能由字母,数字以及下划线构成,密码则可以包含任意字符。角色名长度不能超过 64 字节。

角色描述可以是任意字符串,长度不超过 512 字节。

  • URI: /role

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    role

    角色名

    字符串

    description

    角色描述

    字符串

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/role
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek
    Input:
    {
        "role": "new_role",
        "description": "This is a new role.",
    }

Example response.

    • 200: OK

6.2.2.修改角色描述

修改角色的描述。只有管理员有权限进行此操作。角色描述可以是任意字符串,长度不超过 512 字节。

  • URI: /role/{role_name}/description

  • METHOD: PUT

  • REQUEST:

    域名

    说明

    类型

    description

    新描述

    字符串

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/role/role1/description
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek
    Input:
    {
        "description": "modified description"
    }

Example response.

    • 200: OK

6.2.3.列出所有角色

列出数据库的所有角色。只有管理员拥有该操作权限。

  • URI: /role/

  • METHOD: GET

  • RESPONSE: 所有角色及其信息。

Example request.

    • GET http://localhost:7070/role
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

• 200: OK
Output:
{
    "admin": {
        "disabled": false,
        "description": "Builtin administrator group.",
        "permissions": {"default":"FULL", "graph1":"FULL"}
    },
    "role1": {
        "disabled": true,
        "description": "Another role",
        "permissions": {"default":"READ"}
    }
}

6.2.4.获取角色信息

列出给定角色的信息。

  • URI: /role/{role_name}

  • METHOD: GET

  • RESPONSE: 角色信息。

Example request.

    • GET http://localhost:7070/role/role1
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

• 200: OK
Output:
{
    "disabled": true,
    "description": "Another role",
    "permissions": {"default":"READ"}
}

6.2.5.删除角色

删除指定角色,只有管理员拥有该操作权限。

  • URI: /role/{role_name}

  • METHOD: DELETE

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • DELETE http://localhost:7070/role/role1
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

    • 200: OK

6.2.6.禁用角色

角色可以被禁用。角色被禁用后,具有该角色的用户将不再从该角色中获得任何权限。只有管理员可以执行此操作。

  • URI: /role/{role_name}/disable

  • METHOD: POST

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/role/role1/disable
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

    • 200: OK

6.2.7.启用角色

启用一个被禁用的角色。

  • URI: /role/{role_name}/enable

  • METHOD: POST

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/role/role1/enable
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek

Example response.

    • 200: OK

6.2.8.设置角色权限

为指定角色设置权限。只有管理员可以执行此操作。

角色权限列表必须是“全量列表”,即该列表需要包含该角色能操作的所有图及其权限。

  • URI: /role/{role_name}/permissions

  • METHOD: POST

  • REQUEST: 图名称及相应权限的字典。

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/role/role1/permissions
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    • Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek
    Input:
    {
        "graph1" : "FULL",
        "graph2" : "READ"
    }

Example response.

    • 200: OK

6.3.服务器状态

6.3.1.修改服务器配置

修改服务器配置,配置修改后立即生效,并将影响所有服务器。这些配置的优先级高于配置文件以及命令行参数。

  • URI: /config

  • METHOD: PUT

  • REQUEST:

请求为一个字典,使用 {"opt1":v1} 可以将名为opt1的配置修改为v1

配置名

说明

值类型

OPT_DB_ASYNC

是否启用异步模式

布尔值

OPT_TXN_OPTIMISTIC

是否默认使用乐观事务锁

布尔值

OPT_AUDIT_LOG_ENABLE

是否启用审计日志

布尔值

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • PUT http://localhost:7070/config
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json
    Input:
    {
        "OPT_DB_ASYNC": true,
        "OPT_AUDIT_LOG_ENABLE": false
    }

Example response.

    • 200: OK

6.3.2.当前服务器状态

  • URI: /info

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    lgraph_version

    服务器版本号

    字符串

    git_branch

    服务器代码分支

    字符串

    git_commit

    服务器代码版本

    字符串

    web_commit

    前端码版本

    字符串

    cpp_id

    CPP 编译器 ID

    字符串

    cpp_version

    CPP 编译器版本

    字符串

    python_version

    PYTHON 版本

    字符串

    node

    点 uri

    字符串

    relationship

    边 uri

    字符串

    cpu

    cpu 信息

    字典,格式参见服务器 CPU 状态

    disk

    硬盘 IO 信息

    字典,格式参见服务器硬盘状态

    memory

    内存信息

    字典,格式参见服务器内存状态

    db_space

    图数据库占用空间

    字典,格式参见图数据库占用空间

    db_config

    图数据库配置信息

    字典,格式参见图数据库配置信息

    up_time

    数据库在线时长(秒)

    整型

Example request.

    • GET http://localhost:7070/info
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
      "lgraph_version": "1.2.0",
      "git_branch": "master",
      "git_commit": "9e2977d",
      "web_commit": "1e2823d",
      "cpu_id": "GUN",
      "cpu_version": "4.8.5",
      "python_version": "3.2",
      "node": "/node",
      "relationship": "/relationship",
      "cpu": {
        "self": 25,
        "server": 35,
        "unit": "%"
      },
      "disk": {
        "read": 2000,
        "write": 2000,
        "unit": "B/s"
      },
      "memory": {
        "self": 25016,
        "server_avail": 46865636,
        "server_total": 65860552,
        "unit": "KB"
      },
      "db_space": {
        "space": 57344,
        "unit": "B"
      },
      "db_config": {
        "db_async": false,
        "disable_auth": false,
        "enable_ha": false,
        ...
      },
      "up_time": 3235
    }

6.3.3.服务器 CPU 状态

  • URI: /info/cpu

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    self

    图数据库应用程序 CPU 使用率

    整型

    server

    服务器 CPU 使用率

    整型

    unit

    单位

    字符串

Example request.

    • GET http://localhost:7070/info/cpu
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
      "self": 25,
      "server": 35,
      "unit": "%"
    }

6.3.4.服务器硬盘状态

  • URI: /info/disk

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    read

    服务器硬盘读速率

    整型

    write

    服务器硬盘写速率

    整型

    unit

    单位

    字符串

Example request.

    • GET http://localhost:7070/info/disk
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
      "read": 2000,
      "write": 2000,
      "unit": "B/s"
    }

6.3.5.服务器内存状态

  • URI: /info/memory

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    self

    图数据库应用程序内存使用量

    整型

    server_avail

    服务器可用内存

    整型

    server_total

    服务器总内存

    整型

    unit

    单位

    字符串

Example request.

    • GET http://localhost:7070/info/memory
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
      "self": 25016,
      "server_avail": 46865636,
      "server_total": 65860552,
      "unit": "KB"
    }

6.3.6.图数据库占用空间

  • URI: /info/db_space

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    space

    图数据库占用空间

    整型

    disk_avail

    图数据库可用空间

    整型

    disk_total

    服务器硬盘总空间

    整型

    unit

    单位

    字符串

Example request.

    • GET http://localhost:7070/info/db_space
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
      "disk_avail"::360074579968,
      "disk_total"::984373800960,
      "space": 57344,
      "unit": "B"
    }

6.3.7.图数据库配置信息

  • URI: /info/db_config

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    db_async

    图数据库工作模式(同步或异步)

    布尔值

    disable_auth

    是否禁用身份验证

    布尔值

    enable_ha

    是否启用高可用模式

    布尔值

    enable_rpc

    是否启用 RPC 服务器

    布尔值

    bind_host

    REST 服务器的主机

    字符串

    enable_audit_log

    是否启用日志审计

    布尔值

    port

    REST 服务器的端口

    整型

    rpc_port

    RPC 服务器的端口

    整型

    optimistic_txn

    是否默认使用乐观事务锁

    布尔值

    thread_limit

    图数据库应用程序的可用线程数

    整型

    enable_ssl

    是否使用 SSL 进行身份验证

    布尔值

    verbose

    输出的详细程度

    整型

Example request.

    • GET http://localhost:7070/info/db_config
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
      "db_async":false,
      "disable_auth":false,
      "enable_ha":false,
      "enable_rpc":false,
      "bind_host":"127.0.0.1",
      "enable_audit_log":false,
      "port":7070,
      "optimistic_txn":false,
      "rpc_port":9091,
      "thread_limit":0,
      "enable_ssl":false,
      "verbose":2
    }

6.3.8.高可用服务器列表

(仅在高可用模式下有效)

  • URI: /info/peers

  • METHOD: GET

  • RESPONSE: 如果成功,则返回 200 代码,并返回一个服务器信息列表,其中每个服务器信息格式为:

    域名

    说明

    类型

    rpc_address

    服务器 RPC 地址

    字符串

    rest_address

    服务器 REST 地址

    字符串

    state

    服务器状态

    字符串

其中服务器状态可为 MASTER,SLAVE,OFFLINE

Example request.

    • GET http://localhost:7070/info/peers
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
      [
          {
              "rest_address":"192.168.1.22:17071",
              "rpc_address":"192.168.1.22:19091",
              "state":"MASTER"
          },
          {
              "rest_address":"192.168.1.22:17072",
              "rpc_address":"192.168.1.22:19092",
              "state":"SLAVE"
          }
      ]
    }

6.3.9.当前 Leader 信息

(仅在高可用模式下有效)

  • URI: /info/leader

  • METHOD: GET

  • RESPONSE: 如果成功,则返回 200 代码,并返回当前 leader 服务器信息,格式为:

    域名

    说明

    类型

    rpc_address

    服务器 RPC 地址

    字符串

    rest_address

    服务器 REST 地址

    字符串

Example request.

    • GET http://localhost:7070/info/leader
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
      "rest_address":"192.168.1.22:17071",
      "rpc_address":"192.168.1.22:19091"
    }

6.3.10.服务器统计信息

  • URI: /info/statistics

  • METHOD: GET

  • RESPONSE: 如果成功,则返回 200 代码,并返回当前服务器统计信息,格式为:

    域名

    说明

    类型

    requests/second

    每秒处理的请求数量

    浮点型

    writes/second

    每秒处理的写请求数量

    浮点型

    running_tasks

    正在执行的请求数量

    整型

    failure_rate

    请求失败率

    浮点型

Example request.

    • GET http://localhost:7070/info/statistics
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "failure_rate": 2.3,
        "requests/second": 122.3,
        "running_tasks": 10,
        "writes/second": 12.4
    }

6.3.11.审计日志信息

  • URI: /info/log/?begin_time={begin_time}&end_time={end_time}&user={user}&num_log={num_log}&descending_order={descending_order}

    域名

    说明

    类型

    begin_time

    查询日志的起始时间(必填,格式为 YYYY-mm-dd HH:MM:SS)

    时间戳

    end_time

    查询日志的结束时间(默认为当前时间,格式为 YYYY-mm-dd HH:MM:SS)

    时间戳

    user

    查询日志的操作者(管理员可查询所有用户的日志,普通用户只能查询本人日志)

    字符串

    num_log

    查询日志的数量(默认为 100)

    整型

    descending_order

    查询结果是否降序输出(默认为 true)

    布尔值

  • METHOD: GET

  • RESPONSE: 如果成功,则返回 200 代码,并返回审计日志列表,其中每个元素是一条操作日志,其格式为:

    域名

    说明

    类型

    index

    该操作的索引值

    整型

    begin_time

    该操作的开始时间

    字符串

    end_time

    该操作的结束时间

    字符串

    user

    该操作的发起者

    字符串

    graph

    该操作的图

    字符串

    type

    该操作的类型

    字符串

    read_write

    该操作为读操作或者写操作

    字符串

    success

    该操作是否成功

    布尔值

    content

    该操作的简要内容

    字符串

Example request.

    • GET http://localhost:7070/info/log/?begin_time=2020-02-17%2015:00:00&end_time=2020-02-20%2012:00:00&user=admin&num_log=100&descending_order=false
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        [
            {
                "begin_time": "2020-02-17 15:27:15",
                "content": "post /login    Successful",
                "end_time": "2020-02-17 15:27:15",
                "graph": "",
                "index": 1,
                "read_write": "read",
                "success": true,
                "type": "Security",
                "user":"admin"
            },
            {
                "begin_time": "2020-02-17 15:27:15",
                "content": "Load plugin : `echo`    Successful",
                "end_time": "2020-02-17 15:27:15",
                "graph": "default",
                "index": 2,
                "read_write": "write",
                "success": true,
                "type": "Plugin",
                "user": "admin"
            },
            ...
        ]
    }

6.4.任务管理

TuGraph 提供长任务的跟踪和中止功能。用户可以通过 REST API 来查询当前正在运行的在 Cypher 和存储过程查询,并选择中止正在执行的查询。

任务管理对应的 URI 格式为

    http://{host}:{port}/task/{thread_id}/{task_id}

6.4.1.查询正在执行的任务

  • URI: /task

  • METHOD: GET

  • RESPONSE:

返回的 JSON 为一个数组,其中每一个元素格式如下:

域名

说明

类型

description

任务描述

字符串

time_elapsed

任务已经执行的时间,单位为秒

浮点

task_id

任务 ID

字符串

Example request.

    • GET http://localhost:7070/task
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        [
            {
                "description" : "[CPP_PLUGIN] scan_graph",
                "time_elapsed" : 13.987,
                "task_id" : "3_10"
            },
            {
                "description" : "[CYPHER] MATCH(n) return n",
                "time_elapsed" : 30.887,
                "task_id" : "2_6"
            }
        ]
    }

6.4.2.中止任务

  • URI: /task/{task_id} 其中 {task_id}GET /task 返回结果中的 task_id

  • METHOD: DELETE

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • DELETE http://localhost:7070/task/3_10
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK

6.5.子图管理

TuGraph 支持多子图,子图之间完全独立,不同的子图可以对不同用户开放不同权限。管理员可以添加和删除子图。

6.5.1.创建新子图

  • URI: /db

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    name

    子图名

    字符串

    config

    配置

    字典,格式为 { {列名 1}:{列值 1},… }

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/db
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json
    Input:
    {
        "name":"graph1",
        "config" : {
            "max_size_GB":2048,
            "description": "description of graph1"
        }
    }

Example response.

    • 200: OK

6.5.2.删除子图

  • URI: /db/{graph_name}

  • METHOD: DELETE

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • DELETE http://localhost:7070/db/graph1

Example response.

    • 200: OK

6.5.3.列出所有子图

  • URI: /db

  • METHOD: GET

  • RESPONSE: 子图列表

Example request.

    • GET http://localhost:7070/db

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "graph1": {
            "max_size_GB":1024,
            "description":"description of graph1"
        }
    }

6.5.4.获取子图信息

  • URI: /db/{graph_name}

  • METHOD: GET

  • RESPONSE: 子图列表

Example request.

    • GET http://localhost:7070/db/graph1

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "max_size_GB":1024,
        "description":"description of graph1"
    }

6.6.元数据管理

TuGraph 是一个具备多图能力的强模式属性图数据库。在每一张子图中,每种点和边都需要有预定义的数据格式。数据格式由 Label 决定,每种 Label 都有自己的数据格式。用户可以使用 REST API 添加,删除和查询 Label 及其对应的数据格式。

Label 操作对应的 URI 格式为

    http://{host}:{port}/db/{graph_name}/label/{type}/{label_name}

其中{type}可以是 node 或者 relationship。

6.6.1.创建Label

创建 Label 的过程同时也是定义其数据类型的过程。只有创建了 Label 才能在图中插入相应类型的点或者边。

  • URI: /db/{graph_name}/label

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    name

    Label 名

    字符串

    fields

    数据列定义

    列表

    is_vertex

    是否是点 Label

    布尔值

    primary

    点的主键属性

    字符串

    edge_constraints

    边的约束

    列表

primaryis_vertextrue 的时候设置,这个字段只有点才有, 创建点的时候必须设置。

edge_constraintsis_vertexfalse 的时候设置,这个字段只有边有。这个字段限制了该边的起点和终点只能是哪些点的组合,比如:[["vertex_label1","vertex_label2"],["vertex_label3","vertex_label4"]],限制了该边只能是从 vertex_label1vertex_label2 和 从 vertex_label3vertex_label4。如果不想有任何限制,不设置该字段即可。

其中fields为一个数组,其中每个元素定义数据的一列,内容如下:

域名

说明

类型

name

列名

字符串

type

列数据类型

字符串,有以下类型: int8, int16, int32, int64, float, double, string, date, datetime, binary, bool

optional

数据是否可以为空(可选,缺省值为 false)

布尔值

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/db/{graph_name}/label
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json
    Input:
    {
        "name":"Actor",
        "fields": [
                {"name":"uid", "type":"int64", "optional":false},
                {"name":"name", "type":"string", "optional":true}
        ],
        "is_vertex":true,
        "primary" : "uid"
    }

Example response.

    • 200: OK

6.6.2.列出所有 Label

  • URI: /db/{graph_name}/label

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    edge

    边 Label 列表

    列表

    vertex

    点 Label 列表

    列表

Example request.

    • GET http://localhost:7070/db/{graph_name}/label
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "edge": [
            "HAS_CHILD",
            "MARRIED",
            "BORN_IN",
            "DIRECTED",
            "WROTE_MUSIC_FOR",
            "ACTED_IN"
        ],
        "vertex": [
            "Person",
            "City",
            "Film"
        ]
    }

6.6.3.获取 Label 的数据格式定义

  • URI: /db/{graph_name}/label/{[node|relationship]}/{label_name}

  • METHOD: GET

  • RESPONSE: 数据列定义表,类型是一个词典,key 为列名,value 为列定义,列定义见如下:

域名

说明

类型

optional

该列值是否可为空

布尔值

type

列值类型

字符串

Example request.

    • GET http://localhost:7070/db/{graph_name}/label/node/person
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "age":{
            "optional":false,
            "type":"int16"
        },
        "id":{
            "optional":false,
            "type":"int8"
        },
        "name":{
            "optional":false,
            "type":"string"
        }
    }

6.6.4.Schema 导入

  • URI: /db/{graph_name}/schema/text

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    description

    文件内容描述

    字符串

description 的具体描述方法见《TuGraph 操作手册》中数据导入配置文件的相关内容。

  • RESPONSE:

Schema 导入会根据 description 比较新的 Schema 和数据库中原有的 Schema 是否兼容,检查的粒度为 Label。如果不一致则出错,如果一致则添加原先 Schema 中不存在的 Label,返回 200。

Example request.

    • POST http://localhost:7070/db/graph1/schema/text
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
      "description": "{\\"schema\\":[{\\"label\\":\\"actor\\",\\"primary\\":\\"aid\\",\\"properties\\":[{\\"name\\":\\"aid\\",\\"type\\":\\"STRING\\"}],\\"type\\":\\"VERTEX\\"}]}"
    }

上述 description 的值是如下 json 序列化后的字符串:

{
  "schema": [
    {
      "label": "actor",
      "type": "VERTEX",
      "properties": [{ "name": "aid", "type": "STRING" }],
      "primary": "aid"
    }
  ]
}

Example response.

    • 200: OK
    Output:
    {
        "log": ""
    }

6.7.点操作

URI 格式为

    http://{host}:{port}/db/{graph_name}/node/{vid}

Nodes 提供节点(Vertex)的 CRUD 操作,接受 GET/POST/PUT/DELETE 请求。

6.7.1.列出点数量和label数量

  • URI: /db/{graph_name}/node

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    num_label

    点 label 数量

    整数

    num_vertex

    点数量

    整数

注意 num_vertex 返回的并不是准确的点数量,只是一个估计值。

6.7.2.创建一个点

向数据库中插入一个点。

  • URI: /db/{graph_name}/node

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    label

    Label 名

    字符串

    property

    点属性

    字典,其中 key 是列名,value 是相应值。value 必须是与列类型相应的类型,如列为 int32,则 value 只能是整数。

  • RESPONSE: 如果成功,返回代码 200。并在 JSON 内容中返回新点 vid。该 ID 可用于后续的点操作中。

Example request.

    • POST http://localhost:7070/db/{graph_name}/node
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json
    Input:
    {
        "label" : "Person",
        "property" : {
            "name" : "Passerby A",
            "birthyear" : 1989
        }
    }

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        21
    }

6.7.3.批量创建点

TuGraph 允许一次性插入多个点,以减少网络开销。

  • URI: /db/{graph_name}/node

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    label

    Label 名

    字符串

    fields

    点属性

    列表

    values

    点数据

    列表

其中 fields 是一个字符串列表,列出一系列列名;values 是一个列表,其中每个元素是一个列表,列表中每个元素是列数据。

  • RESPONSE: 如果成功,返回代码 200。并在 JSON 内容中返回新增加的点的 vid 列表,该列表中每一个 vid 按顺序对应请求中的每一个点。

Example request.

    • POST http://localhost:7070/db/{graph_name}/node
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json
    Input:
    {
        "label" : "Person",
        "fields" : ["name", "birthyear"],
        "values" : [["alex", 2000],
                    ["bob", 1999]]
    }

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        [
            22,
            23
        ]
    }

6.7.4.获取点

  • URI: /db/{graph_name}/node/{vertex_id}

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    label

    Label 名

    字符串

    property

    属性

    字典,格式为 { {列名 1}:{列值 1},…}

Example request.

    • GET http://localhost:7070/db/{graph_name}/node/5
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "property": {
            "birthyear": 1963,
            "name": "Natasha Richardson"
        },
        "label": "Person"
    }

6.7.5.删除点

  • URI: /db/{graph_name}/node/{vertex_id}

  • METHOD: DELETE

  • RESPONSE: 如果成功,返回代码 200。

    域名

    说明

    类型

    in

    被删掉的点的入边数量

    整数值

    out

    被删掉的点的出边数量

    整数值

Example request.

    • DELETE http://localhost:7070/db/{graph_name}/node/4
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "in": 0,
        "out": 0
    }

6.7.6.获取点所有属性

  • URI: /db/{graph_name}/node/{vertex_id}/property

  • METHOD: GET

  • RESPONSE: Node 所有属性(字典)

Example request.

    • GET http://localhost:7070/db/{graph_name}/node/5/property
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "birthyear": 1963,
        "name": "Natasha Richardson"
    }

6.7.7.获取点属性

  • URI: /db/{graph_name}/node/{vertex_id}/property/{field}

  • METHOD: GET

  • RESPONSE: Node 某一属性

Example request.

    • GET http://localhost:7070/db/{graph_name}/node/5/property/name
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "Natasha Richardson"
    }

6.7.8.更新点属性

  • URI: /db/{graph_name}/node/{vertex_id}

  • METHOD: PUT

  • REQUEST:

    域名

    说明

    类型

    property

    点属性

    字典

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • PUT http://localhost:7070/db/{graph_name}/node/5
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json
    Input:
    {
      "property" : {
        "birthyear" : 1964,
        "mobile" : "********"
      }
    }

Example response.

    • 200: OK

6.8.边操作

URI 格式为

    http://{host}:{port}/db/{graph_name}/relationship/{euid}

与 Nodes 功能类似,Relationships 提供边(edge)的 CRUD 操作,接受 GET/POST/PUT/DELETE 请求。每一条边都可以由一个唯一 ID(euid)来标识。这个 ID 可以从在插入边时获得,或者在 列出所有边 操作中得到。

6.8.1.创建一条边

  • URI: /db/{graph_name}/node/{src}/relationship

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    label

    边 Label

    字符串

    destination

    目的点 ID

    整数值

    property

    边属性

    字典

  • RESPONSE: 如果成功,返回代码 200,同时返回新建立的边的 euid(字符串)。

Example request.

    • POST http://localhost:7070/db/{graph_name}/node/{src}/relationship
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json
    Input:
    {
      "destination" : 14,
      "label" : "BORN_IN",
      "property" : {}
    }

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "1_14_1_0"
    }

6.8.2.批量创建边

  • URI: /db/{graph_name}/relationship

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    label

    边 Label

    字符串

    fields

    数据列名

    列表

    edge

    边数据

    列表

其中 edge 是一个数据列表,其中每个元素都是一条边,其定义如下:

域名

说明

类型

source

起点 id

整数

destination

终点 id

整数

values

数据列表

列表,每列对应 fields 中的一个列,类型是该列对应的类型

  • RESPONSE: 如果成功,返回代码 200,同时返回新建立的边的 euid 列表。

Example request.

    • POST http://localhost:7070/db/{graph_name}/relationship
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json
    Input:
    {
      "label" : "knows",
      "fields" : ["from_year", "weight"],
      "edge" : [
          {"source":0, "destination":1, "values":[2011, 0.8]},
          {"source":1, "destination":2, "values":[2008, 0.9]}
      ]
    }

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        [
            "0_1_0_0",
            "1_2_0_0"
        ]
    }

6.8.3.列出所有出边(outgoing relationships)

  • URI: /db/{graph_name}/node/{src}/relationship/out

  • METHOD: GET

  • RESPONSE: 点 src 的所有出边 euid 列表

Example request.

    • GET http://localhost:7070/db/{graph_name}/node/4/relationship/out
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        [
            "4_5_0_0",
            "4_7_1_2"
        ]
    }

6.8.4.列出所有入边(incoming relationships)

  • URI: /db/{graph_name}/node/{dst}/relationship/in

  • METHOD: GET

  • RESPONSE: 点 dst 的所有入边 euid 列表

Example request.

    • GET http://localhost:7070/db/{graph_name}/node/4/relationship/in
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        [
            "0_4_0_0",
            "3_4_3_1"
        ]
    }

6.8.5.列出所有边

  • URI: /db/{graph_name}/node/{src}/relationship/all

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    in

    入边

    列表

    out

    出边

    列表

Example request.

    • GET http://localhost:7070/db/{graph_name}/node/4/relationships/all
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "out": [
            "4_5_0_0",
            "4_7_1_2"
        ],
        "in": [
            "0_4_0_0",
            "3_4_3_1"
        ]
    }

6.8.6.获取边

  • URI: /db/{graph_name}/relationship/{euid}

  • METHOD: GET

  • RESPONSE:

    域名

    说明

    类型

    label

    边 Label

    字符串

    property

    边属性

    字典

Example request.

    • GET http://localhost:7070/db/graph1/relationship/0_4_0_0
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "property": {
        },
        "label": "MARRIED"
    }

6.8.7.删除边

  • URI: /db/{graph_name}/relationship/{euid}

  • METHOD: DELETE

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • DELETE http://localhost:7070/db/graph1/relationship/14_0_1_0
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK

6.8.8.获取边的所有属性

  • URI: /db/{graph_name}/relationship/{euid}/property

  • METHOD: GET

  • RESPONSE: 边属性字典

Example request.

    • GET http://localhost:7070/db/graph1/relationship/14_0_2_0/property
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        {
            "weight": 0.8,
            "begin": 20180922
        }
    }

6.8.9.获取边的属性

  • URI: /db/{graph_name}/relationship/{euid}/property/{field}

  • METHOD: GET

  • RESPONSE: 如果成功,返回代码 200,同时返回边的属性。如果失败,返回代码 400,同时返回 “Illegal field.”。

Example request.

    • GET http://localhost:7070/db/graph1/relationship/17_0_2_2/property/charactername
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        "Henri Ducard"
    }

6.8.10.更新边的属性

  • URI: /db/{graph_name}/relationship/{euid}

  • METHOD: PUT

  • REQUEST:

    域名

    说明

    类型

    property

    边属性

    字典

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • PUT http://localhost:7070/db/graph1/relationship/17_0_2_2
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json
    Input:
    {
      "property" : {
        "charactername" : "Henri Ducard/passer a"
      }
    }

Example response.

    • 200: OK

6.9.索引

URI 格式为

    http://{host}:{port}/db/{graph_name}/index/{label}/{field}

提供索引操作,接受 GET/POST 请求。

6.9.1.创建索引

该操作会启动一个创建索引的后台任务,用户可以通过列出该 Label 相关的所有索引来检查新建索引的状态。

  • URI: /db/{graph_name}/index

  • METHOD: POST

  • REQUEST:

域名

说明

类型

label

Label 名

字符串

field

域名

字符串

type

索引类型

int类型,0表示非唯一索引,1表示全局唯一索引,2表示两点间唯一索引

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • POST http://localhost:7070/db/graph1/index
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json
    Input:
    {
      "label": "Person",
      "field": "birthyear",
      "is_unique" : false
    }

Example response.

    • 200: OK

6.9.2.列出所有索引

  • URI: /db/{graph_name}/index

  • METHOD: GET

  • RESPONSE: 索引列表,其中每一个元素是一个索引描述,格式与创建索引时使用格式相同。

Example request.

    • GET http://localhost:7070/db/graph1/index
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        [
            {
                "field": "name",
                "label": "City",
                "is_unique": false
            },
            {
                "field": "title",
                "label": "Film",
                "is_unique": false
            },
            {
                "field": "name",
                "label": "Person",
                "is_unique": true
            },
            {
                "label": "Person",
                "field": "age",
                "is_unique": false
            }
        ]
    }

6.9.3.列出所有与某个 Label 相关的索引

  • URI: /db/{graph_name}/index/{label}

  • METHOD: GET

  • RESPONSE: 索引列表,其中每一个元素是一个索引描述,格式与创建索引时使用格式相同。

Example request.

    • GET http://localhost:7070/db/graph1/index/Person
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    • Content-Type: application/json; charset=UTF-8
    Output:
    {
        [
            {
                "label": "Person",
                "field": "name",
                "is_unique": true
            },
            {
                "label": "Person",
                "field": "age",
                "is_unique": false
            }
        ]
    }

6.9.4.删除索引

  • URI: /db/{graph_name}/index/{label}/{field}

  • METHOD: DELETE

  • RESPONSE: 如果成功,返回代码 200。

Example request.

    • DELETE http://localhost:7070/db/graph1/index/Person/name
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK

6.9.5.根据索引获取点

  • URI: /db/{graph_name}/index/{label}/?field={field}&value={value}

  • METHOD: GET

  • RESPONSE: 点 vid 列表

Example request.

    • GET http://localhost:7070/db/graph1/index/Person/?field=birthyear&value=1986
    • Accept: application/json; charset=UTF-8

Example response.

    • 200: OK
    Output:
    {
        [
            1,
            8
        ]
    }

6.10.在线增量导入

6.10.1.指定文件内容导入

  • URI: /db/{graph_name}/import/text

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    description

    文件内容描述

    字符串

    data

    要导入的文件内容(建议最大在 16MB 左右,最长不超过 17MB)

    字符串 / 数组 / 对象

    continue_on_error

    出错后是否继续导入(可选,默认为false

    布尔值

    delimiter

    分隔符(可选,默认为“,”

    字符串

description 的具体描述方法见《TuGraph 操作手册》中数据导入配置文件的相关内容。

分隔符可以是单字符,也可以是字符串,但不能包含\r或者\n

data 可以是如下形式之一:

  • 字符串如 "1,2\n3,4\n"

  • ASCII 码组成的数组如 [49,44,50,10,51,44,52,10]

  • 形如上述数组的字典如 {"0":49,"1":44,"2":50,"3":10,"4":51,"5":44,"6":52,"7":10}

  • RESPONSE:

系统不会自动执行新建 label、添加索引等操作。在此操作之前需要保证涉及的 label 已经存在并具有适当的索引。

如果成功导入完毕,返回代码 200,并在 log 字段返回一些日志信息(可能为空);否则,保证所有的数据均未被导入,并在 error_message 字段返回错误信息。

Example request.

    • POST http://localhost:7070/db/graph1/import/text
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
      "description": "{\\"files\\":[{\\"columns\\":[\\"SRC_ID\\",\\"role\\",\\"DST_ID\\"],\\"format\\":\\"CSV\\",\\"label\\":\\"role\\",\\"SRC_ID\\":\\"actor\\",\\"DST_ID\\":\\"movie\\"}]}"}",
      "data": "1,Role1,2\n3,Role2,4\n",
      "continue_on_error": true,
      "delimiter": ","
    }

上述 description 的值是如下 json 序列化后的字符串

{
  "files": [
    {
      "format": "CSV",
      "label": "role",
      "SRC_ID": "actor",
      "DST_ID": "movie",
      "columns": ["SRC_ID", "role", "DST_ID"]
    }
  ]
}

Example response.

    • 200: OK
    Output:
    {
        "log": "Missing src uid 1\n"
    }

由于请求中指定了在出错时继续,该返回信息说明 SRC_ID 为 1 的边没有被导入,而其他信息导入成功。

6.11.其他

URI 格式为

    http://{host}:{port}/db/{graph_name}/misc

6.11.1.提取子图

给出点 id 集合,返回包含该集合的最小子图。

  • URI: /db/{graph_name}/misc/sub_graph

  • METHOD: POST

  • REQUEST:

    域名

    说明

    类型

    vertex_ids

    点 id 集合

    列表

  • RESPONSE:

    域名

    说明

    类型

    nodes

    点数据

    列表,每元素包含 vid, label, 以及属性

    relationships

    边数据

    列表,每元素包含 src, dst, euid, label, 以及属性

Example request.

    • POST http://localhost:7070/db/graph1/misc/sub_graph
    • Accept: application/json; charset=UTF-8
    • Content-Type: application/json; charset=UTF-8
    Input:
    {
      "vertex_ids": [2, 5, 14, 20]
    }

Example response.

• 200: OK
    Output:
    {
        "nodes": [
            {
                "label": "Person",
                "properties": {
                    "birthyear": 1937,
                    "name": "Vanessa Redgrave"
                },
                "vid": 2
            },
            {
                "label": "Person",
                "properties": {
                    "birthyear": 1963,
                    "name": "Natasha Richardson"
                },
                "vid": 5
            },
            {
                "label": "City",
                "properties": {
                    "name": "London"
                },
                "vid": 14
            },
            {
                "label": "Film",
                "properties": {
                    "title": "Camelot"
                },
                "vid": 20
            }
        ],
        "relationships": [
            {
                "destination": 5,
                "label": "HAS_CHILD",
                "properties": {
                    "birthyear": 1937,
                    "name": "Vanessa Redgrave"
                },
                "source": 2
            },
            {
                "destination": 14,
                "label": "BORN_IN",
                "properties": {
                    "birthyear": 1937,
                    "name": "Vanessa Redgrave"
                },
                "source": 2
            },
            {
                "destination": 20,
                "label": "ACTED_IN",
                "properties": {
                    "birthyear": 1937,
                    "charactername": "Guenevere",
                    "name": "Vanessa Redgrave"
                },
                "source": 2
            },
            {
                "destination": 14,
                "label": "BORN_IN",
                "properties": {
                    "birthyear": 1963,
                    "name": "Natasha Richardson"
                },
                "source": 5
            }
        ]
    }