本文档详细介绍如何使用 UModel 的 API 和 SDK 进行各种操作,包括 Workspace 管理、UModel 数据操作、EntityStore 管理等核心功能。
操作方法对比
UModel 提供三种主要的操作方式:
操作方式 | 适用场景 | 优势 | 劣势 |
SDK | 程序集成开发 | 类型安全、功能完整、直接调用 | 需要编程技能 |
umctl | 命令行操作 | 简单易用、支持批量操作、YAML友好 | 功能相对有限 |
控制台 | 可视化查询 | 界面友好、可视化效果好 | 只支持查询功能 |
SDK获取和配置
一. SDK下载
Java SDK:
<!-- Maven依赖 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>cms20240330</artifactId>
<version>${latest}</version>
</dependency>
最新版本号可参考:https://mvnrepository.com/artifact/com.aliyun/cms20240330
Python SDK:
pip install alibabacloud_cms20240330
其他语言 SDK。
Go SDK:支持完整功能。
C++ SDK:支持完整功能。
NodeJS SDK:支持完整功能。
2. 客户端初始化
Java 案例:
import com.aliyun.cms20240330.Client;
import com.aliyun.cms20240330.models.*;
// 配置客户端
Config config = new Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret)
.setEndpoint("cms.cn-hangzhou.aliyuncs.com");
Client client = new Client(config);
Python 案例:
from alibabacloud_cms20240330.client import Client
from alibabacloud_tea_openapi.models import Config
from alibabacloud_cms20240330 import models as cms_models
# 配置客户端
config_model = open_api_models.Config(
access_key_id=access_key_id,
access_key_secret=access_key_secret,
endpoint='cms.cn-hangzhou.aliyuncs.com'
)
client = Client(config_model)
3. 环境配置说明
Endpoint | 示例 |
|
|
更多region id,请参考:服务入口
Workspace 管理
Workspace 是 UModel 的基础容器,所有操作都需要在特定的 Workspace 中进行。
1. 创建Workspace
// 创建workspace
PutWorkspaceRequest createWorkspaceRequest = new PutWorkspaceRequest()
.setSlsProject(SLS_PROJECT_NAME)
.setDescription("test workspace")
.setDisplayName("test_workspace");
PutWorkspaceResponse workspaceResponse = client.putWorkspace(WORKSPACE_NAME, createWorkspaceRequest);
System.out.println("Create workspace: " + workspaceResponse.getStatusCode() + " " + JSONObject.toJSONString(workspaceResponse));
from alibabacloud_cms20240330.client import Client
from alibabacloud_cms20240330 import models as cms_models
# 创建workspace
create_workspace_request = cms_models.PutWorkspaceRequest(
sls_project=SLS_PROJECT_NAME,
description="test workspace",
display_name="test_workspace"
)
response = client.put_workspace(WORKSPACE_NAME, create_workspace_request)
print(f"Create workspace: {response}")
2. 查询Workspace
// get workspace
GetWorkspaceResponse getWorkspaceResponse = client.getWorkspace(WORKSPACE_NAME);
System.out.println("Get workspace: " + getWorkspaceResponse.getStatusCode() + " " + JSONObject.toJSONString(getWorkspaceResponse));
// list workspaces
ListWorkspacesRequest listWorkspacesRequest = new ListWorkspacesRequest()
.setMaxResults(10)
.setWorkspaceName("test");
ListWorkspacesResponse listWorkspacesResponse = client.listWorkspaces(listWorkspacesRequest);
System.out.println("List workspaces: " + listWorkspacesResponse.getStatusCode() + " " + JSONObject.toJSONString(listWorkspacesResponse));
# get workspace
response = client.get_workspace(WORKSPACE_NAME)
print(f"Get workspace: {response}")
# list workspaces
response = client.list_workspaces(cms_models.ListWorkspacesRequest(
max_results=10,
workspace_name='test'
))
print(f"List workspaces: {response}")
3. 删除Workspace
// delete workspace
DeleteWorkspaceResponse deleteWorkspaceResponse = client.deleteWorkspace(WORKSPACE_NAME);
System.out.println("Delete workspace: " + deleteWorkspaceResponse.getStatusCode() + " " + JSONObject.toJSONString(deleteWorkspaceResponse));
# delete workspace
response = client.delete_workspace(WORKSPACE_NAME)
print(f"Delete workspace: {response}")
资源管理
注意:在创建Workspace后,云监控2.0会自动创建UModel、EntityStore资源。
UModel、EntityStore作为Workspace的子资源仍可使用API进行操作。
UModel 资源管理
注意:创建UModel资源时,会同时创建EntityStore资源。
// create umodel
try {
CreateUmodelRequest createUmodelRequest = new CreateUmodelRequest()
.setDescription("test umodel");
CreateUmodelResponse createUmodelResponse = client.createUmodel(WORKSPACE_NAME, createUmodelRequest);
System.out.println("Create umodel: " + createUmodelResponse.getStatusCode() + " " + JSONObject.toJSONString(createUmodelResponse));
} catch (TeaException e) {
System.out.println("Create umodel error: " + e.getMessage());
}
// get umodel
try {
GetUmodelResponse getUmodelResponse = client.getUmodel(WORKSPACE_NAME);
System.out.println("Get umodel: " + getUmodelResponse.getStatusCode() + " " + JSONObject.toJSONString(getUmodelResponse));
} catch (TeaException e) {
System.out.println("Get umodel error: " + e.getMessage());
}
// delete umodel
try {
DeleteUmodelResponse deleteUmodelResponse = client.deleteUmodel(WORKSPACE_NAME);
System.out.println("Delete umodel: " + deleteUmodelResponse.getStatusCode() + " " + JSONObject.toJSONString(deleteUmodelResponse));
} catch (TeaException e) {
System.out.println("Delete umodel error: " + e.getMessage());
}
from Tea.exceptions import TeaException
# create umodel
try:
response = client.create_umodel(WORKSPACE_NAME, cms_models.CreateUmodelRequest(
description="test umodel"
))
print(f"Create umodel: {response.status_code} {response.body}")
except TeaException as e:
print(f"Create umodel error: {e}")
# get umodel
try:
response = client.get_umodel(WORKSPACE_NAME)
print(f"Get umodel: {response.status_code} {response.body}")
except TeaException as e:
print(f"Get umodel error: {e}")
# delete umodel
try:
response = client.delete_umodel(WORKSPACE_NAME)
print(f"Delete umodel: {response.status_code} {response.body}")
except TeaException as e:
print(f"Delete umodel error: {e}")
EntityStore 资源管理
注意:若希望删除EntityStore资源,需要首先调用DeleteUmodel接口。
// create entitystore
try {
CreateEntityStoreResponse createEntityStoreResponse = client.createEntityStore(WORKSPACE_NAME);
System.out.println("Create entitystore: " + createEntityStoreResponse.getStatusCode() + " " + JSONObject.toJSONString(createEntityStoreResponse));
} catch (TeaException e) {
System.out.println("Create entitystore error: " + e.getMessage());
}
// get entitystore
try {
GetEntityStoreResponse getEntityStoreResponse = client.getEntityStore(WORKSPACE_NAME);
System.out.println("Get entitystore: " + getEntityStoreResponse.getStatusCode() + " " + JSONObject.toJSONString(getEntityStoreResponse));
} catch (TeaException e) {
System.out.println("Get entitystore error: " + e.getMessage());
}
// delete entitystore
try {
DeleteEntityStoreResponse deleteEntityStoreResponse = client.deleteEntityStore(WORKSPACE_NAME);
System.out.println("Delete entitystore: " + deleteEntityStoreResponse.getStatusCode() + " " + JSONObject.toJSONString(deleteEntityStoreResponse));
} catch (TeaException e) {
System.out.println("Delete entitystore error: " + e.getMessage());
}
# create entitystore
try:
response = client.create_entity_store(WORKSPACE_NAME)
print(f"Create entitystore: {response.status_code} {response.body}")
except TeaException as e:
print(f"Create entitystore error: {e}")
# get entitystore
try:
response = client.get_entity_store(WORKSPACE_NAME)
print(f"Get entitystore: {response.status_code} {response.body}")
except TeaException as e:
print(f"Get entitystore error: {e}")
# delete entitystore
try:
response = client.delete_entity_store(WORKSPACE_NAME)
print(f"Delete entitystore: {response.status_code} {response.body}")
except TeaException as e:
print(f"Delete entitystore error: {e}")
UModel 数据操作
进行数据操作之前,必须确定UModel、EntityStore资源均存在。
示例UModel:
[
{
"kind": "entity_set",
"schema": {
"url": "umodel.aliyun.com",
"version": "v0.1.0"
},
"metadata": {
"name": "people",
"display_name": {
"en_us": "people",
"zh_cn": "人"
},
"domain": "custom"
},
"spec": {
"default_order": "asc",
"fields": [
{
"display_name": {
"en_us": "name",
"zh_cn": "姓名"
},
"name": "name",
"type": "string"
},
{
"display_name": {
"en_us": "age of people",
"zh_cn": "年龄"
},
"name": "age",
"type": "integer"
},
{
"display_name": {
"en_us": "id of people",
"zh_cn": "人的id"
},
"name": "id_of_people",
"type": "string"
}
],
"name_fields": [
"name"
],
"ordered_fields": [
"name"
],
"time_field": "__time__",
"first_observed_time_field": "__time__",
"last_observed_time_field": "__time__",
"primary_key_fields": [
"id_of_people"
]
}
},
{
"kind": "entity_set_link",
"schema": {
"url": "umodel.aliyun.com",
"version": "v0.1.0"
},
"metadata": {
"name": "link1",
"display_name": {
"en_us": "eat",
"zh_cn": "吃"
},
"domain": "custom"
},
"spec": {
"src": {
"domain": "custom",
"kind": "entity_set",
"name": "people"
},
"dest": {
"domain": "custom",
"kind": "entity_set",
"name": "foods"
},
"entity_link_type": "eat"
}
},
{
"kind": "entity_set",
"schema": {
"url": "umodel.aliyun.com",
"version": "v0.1.0"
},
"metadata": {
"name": "foods",
"display_name": {
"en_us": "foods",
"zh_cn": "食物"
},
"domain": "custom"
},
"spec": {
"default_order": "asc",
"fields": [
{
"display_name": {
"en_us": "name",
"zh_cn": "名称"
},
"name": "name",
"type": "string"
},
{
"display_name": {
"en_us": "id of foods",
"zh_cn": "食物的id"
},
"name": "id_of_foods",
"type": "string"
}
],
"name_fields": [
"name"
],
"ordered_fields": [
"name"
],
"time_field": "__time__",
"first_observed_time_field": "__time__",
"last_observed_time_field": "__time__",
"primary_key_fields": [
"id_of_foods"
]
}
}
]
1. UModel 数据新增/更新
// 读取 UModel elements 数据
String jsonFilePath = "src/main/java/org/example/data/functionTest.json";
List<Map<String, Object>> elementsData = loadUmodelElements(jsonFilePath);
System.out.println("load " + elementsData.size() + " umodel elements");
// upsert umodel
try {
UpsertUmodelDataRequest upsertRequest = new UpsertUmodelDataRequest()
.setMethod("upsert")
.setElements(elementsData);
UpsertUmodelDataResponse upsertResponse = client.upsertUmodelData(WORKSPACE_NAME, upsertRequest);
System.out.println("Upsert umodel: " + upsertResponse.getStatusCode() + " " + JSONObject.toJSONString(upsertResponse));
} catch (TeaException e) {
System.out.println("Upsert umodel error: " + e.getMessage());
}
# 读取 UModel elements 数据
json_file_path = "<your_data_path>"
elements_data = load_umodel_elements(json_file_path)
print(f"load {len(elements_data)} umodel elements")
# upsert umodel
try:
response = client.upsert_umodel_data(WORKSPACE_NAME, cms_models.UpsertUmodelDataRequest(
method="upsert",
elements=elements_data
))
print(f"Upsert umodel: {response.status_code} {response.body}")
except TeaException as e:
print(f"Upsert umodel error: {e}")
2. UModel数据查询
// get umodel data
try {
GetEntityStoreDataRequest getRequest = new GetEntityStoreDataRequest()
.setFrom(1729224800)
.setTo(1730273861)
.setQuery(".umodel");
GetEntityStoreDataResponse getResponse = client.getEntityStoreData(WORKSPACE_NAME, getRequest);
System.out.println("Get umodel data: " + getResponse.getStatusCode() + " " + JSONObject.toJSONString(getResponse));
} catch (TeaException e) {
System.out.println("Get umodel data error: " + e.getMessage());
}
# get umodel data
try:
response = client.get_entity_store_data(WORKSPACE_NAME, cms_models.GetEntityStoreDataRequest(
from_=1729224800,
to=1730273861,
query=f".umodel"
))
print(f"Get umodel data: {response.status_code} {response.body}")
except TeaException as e:
print(f"Get umodel data error: {e}")
这种查询方式是无条件查询 umodel。附带筛选条件、附加图查询等更高级的 umodel 查询请参见 UModel 查询文档。
3. UModel 数据删除
// delete umodel data
try {
DeleteUmodelDataRequest deleteRequest = new DeleteUmodelDataRequest()
.setDomain("custom")
.setKind("entity_set")
.setName("link1");
DeleteUmodelDataResponse deleteResponse = client.deleteUmodelData(WORKSPACE_NAME, deleteRequest);
System.out.println("Delete umodel data: " + deleteResponse.getStatusCode() + " " + JSONObject.toJSONString(deleteResponse));
} catch (TeaException e) {
System.out.println("Delete umodel data error: " + e.getMessage());
}
# delete umodel data
try:
response = client.delete_umodel_data(WORKSPACE_NAME, cms_models.DeleteUmodelDataRequest(
domain="custom",
kind="entity_set",
name="link1"
))
print(f"Delete umodel data: {response.status_code} {response.body}")
except TeaException as e:
print(f"Delete umodel data error: {e}")
错误处理与最佳实践
1. 异常处理模式
public class UModelOperationHelper {
private final Client client;
public UModelOperationHelper(Client client) {
this.client = client;
}
public boolean safeCreateWorkspace(String workspaceName, String description) {
try {
PutWorkspaceRequest request = new PutWorkspaceRequest();
request.setSlsProject(workspaceName);
request.setDescription(description);
PutWorkspaceResponse response = client.putWorkspace(workspaceName, request);
// 检查响应状态
if (response.getStatusCode() == 200) {
System.out.println("Workspace创建成功:" + workspaceName);
return true;
} else {
System.err.println("创建失败,状态码:" + response.getStatusCode());
return false;
}
} catch (com.aliyun.teautil.models.RuntimeOptions.RuntimeException e) {
System.err.println("运行时异常:" + e.getMessage());
return false;
} catch (Exception e) {
System.err.println("未知异常:" + e.getMessage());
return false;
}
}
}
2. 性能优化建议
批量操作
// 批量创建UModel数据
List<Object> batchElements = new ArrayList<>();
// 添加多个元素到批次中...
UpsertUmodelRequest batchRequest = new UpsertUmodelRequest();
batchRequest.setMethod("upsert");
batchRequest.setElements(batchElements);
// 单次请求处理多个元素,提高效率
3. 调试技巧
启用详细日志
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UModelClient {
private static final Logger logger = LoggerFactory.getLogger(UModelClient.class);
private void logRequest(String operation, Object request) {
if (logger.isDebugEnabled()) {
logger.debug("执行操作: {}, 请求参数: {}", operation,
JSONObject.toJSONString(request, true));
}
}
}
响应内容检查
private void validateResponse(String operation, Object response) {
if (response == null) {
throw new RuntimeException(operation + " 返回空响应");
}
// 记录响应用于调试
logger.info("{} 响应: {}", operation, JSONObject.toJSONString(response, true));
}
控制台操作补充
除了SDK操作,UModel还提供了Web控制台进行可视化操作:
控制台主要用于:
可视化查询:USearch、Graph Query、Cypher查询。
数据浏览:UModel数据、实体数据、关系数据的浏览。
调试验证:验证API调用结果,进行数据探索。
总结
本文档涵盖了 UModel API 和 SDK 的完整操作指南,包括:
基础配置:SDK 获取、客户端初始化、环境配置。
核心操作:Workspace 管理、UModel 数据操作、EntityStore 管理。
进阶功能:UModel 资源管理、CommonSchema 操作。
最佳实践:错误处理、性能优化、调试技巧。
通过遵循本指南,开发者可以高效地使用 UModel 进行各种数据建模和管理操作。