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, role1和role2。
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"
},
...
]
}