本体编辑(Ontology edits)总览
函数不只读取数据,还能返回「本体编辑」来创建、修改、删除对象。这篇讲编辑什么时候生效,以及几个容易踩的坑。
https://www.palantir.com/docs/foundry/functions/edits-overview/
原始标题:Language-agnostic features > Ontology edits
先记住这几条
写在前面
Ontology 编辑(Ontology edit)是指创建、修改或删除对象的操作。函数支持返回 Ontology 编辑,供函数支撑的动作使用。
- TypeScript v1 函数使用
@OntologyEditFunction装饰器编写,它提供简化的特殊语义。TypeScript v1 函数还会使用 @Edits 装饰器为动作提供溯源(provenance)信息,动作可利用这些信息执行权限控制。你可以使用验证 Ontology 编辑提供的 API,为 TypeScript v1 的 Ontology 编辑函数编写单元测试。 - TypeScript v2 函数使用从
@osdk/functions包导出的 createEditBatch 函数编写。这些函数依赖Edits类型为动作提供溯源信息。 - Python 函数通过在 Ontology SDK 中导出的 FoundryClient 创建一个编辑容器来编写。这些函数依赖 @function 装饰器的
edits参数为动作提供溯源信息。
本文档的其余部分将描述 Ontology 编辑函数在底层是如何运作的,帮助你更好地理解其基础设施。
编辑何时生效
编辑何时生效
关于 Ontology 编辑函数,一个常见的误解是:运行它们会不会更新 Ontology 中的对象。当你在 Authoring(创作) 环境的函数助手中运行 Ontology 编辑函数时,编辑不会应用到实际对象上。使用函数更新对象的唯一方式,是按照函数支撑的动作文档所述,将动作配置为使用该函数的形式。
这意味着你可以放心地在函数助手中运行 Ontology 编辑函数,用各种输入验证结果,而不必担心对象本身会被更新。
注意事项
注意事项
Edits and object search
对象与链接的变更,会在你的函数执行完毕后才传播到对象集(object set)API。这意味着,任何依赖于被编辑值的 Objects.search() 查询——例如基于你编辑的属性或链接做的过滤、邻近搜索或聚合——都会使用旧的对象、属性和链接,从而可能不反映对 Ontology 的编辑(包括创建与删除)。你的函数需要手动处理这种情况。
这与「检索一个你已编辑过的特定对象(例如通过主键)」不同。后一种情况下,函数基础设施会在对象被物化(materialize)时应用你的待定编辑,因此会返回编辑后的属性和链接值。示例见 The @Edits decorator。
对于下面的示例,假设存在一个 ID 为 1 的 Employee。
import { OntologyEditFunction, Edits } from "@foundry/functions-api";
import { Employee, Objects } from "@foundry/ontology-api";
export class CaveatEditFunctions {
@Edits(Employee)
@OntologyEditFunction()
public async editAndSearch(): Promise<void> {
const employeeOne = Objects.search().employee().filter(e => e.id.exactMatch(1)).all()[0];
employeeOne.name = "Bob";
const count = await Objects.search().employee().filter(e => e.name.exactMatch("Bob")).count() ?? -1;
console.log(count);
// 期望:1,实际:0
}
}import { Client } from "@osdk/client";
import { Employee } from "@ontology/sdk";
import { Edits, createEditBatch } from "@osdk/functions";
type OntologyEdit = Edits.Object<Employee>;
async function editAndSearch(client: Client): Promise<OntologyEdit[]> {
const batch = createEditBatch<OntologyEdit>(client);
const employeeOne = await client(Employee).fetchOne(1);
batch.update(employeeOne, { name: "Bob" });
const count = await client(Employee)
.where({
name: {
$eq: "Bob"
}
})
.aggregate({
$select: {
$count: "unordered"
}
})
.then(response => response.$count);
console.log(count);
// 期望:1,实际:0
return batch.getEdits();
}
export default editAndSearch;from functions.api import function, OntologyEdit
from ontology_sdk import FoundryClient
from ontology_sdk.ontology.objects import Employee
@function(edits=[Employee])
def edit_and_search() -> list[OntologyEdit]:
client = FoundryClient()
ontology_edits = client.ontology.edits()
employee = client.ontology.objects.Employee.get(1)
editable_employee = ontology_edits.objects.Employee.edit(employee)
editable_employee.name = "Bob"
count = client.ontology.objects.Employee.where(Employee.object_type.name == "Bob").count().compute()
print(count)
# 期望:1,实际:0
return ontology_edits.get_edits()Apply Ontology edits in Automate
Automate 不会应用由「作为 effect 使用的函数」所返回的编辑。要通过自动化应用 Ontology 编辑,请改用配置函数支撑的动作。更多信息见 Function effects。
Optional arrays in function-backed actions
在代码仓库中运行 @OntologyEditFunction 时,被省略的可选数组会被当作 undefined 处理;而通过动作执行该函数时,它们会被作为空数组传入。
延伸阅读 · 相关页面
按主题横向跳转,不必顺着目录一篇篇读。
常见问题速答 · FAQ
关于「本体编辑(Ontology edits)总览」,读者最常问的几个问题。