Skip to content

Latest commit

 

History

History
2918 lines (2300 loc) · 74.7 KB

9.restful-api-legacy.md

File metadata and controls

2918 lines (2300 loc) · 74.7 KB

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
            }
        ]
    }