循序渐进 · 教学 · 函数(十三)

本体编辑(Ontology edits)总览

函数不只读取数据,还能返回「本体编辑」来创建、修改、删除对象。这篇讲编辑什么时候生效,以及几个容易踩的坑。

全部目录 ← 上一篇 本体编辑(Ontology edits)总览 下一篇 →
本文来源 · Source 内容整理自 Palantir Foundry 官方文档:
https://www.palantir.com/docs/foundry/functions/edits-overview/
原始标题:Language-agnostic features > Ontology edits

先记住这几条

① 编辑 = 增删改对象
Ontology edit 是对对象的创建、修改、删除操作。
② 函数返回编辑,平台来执行
函数不直接改库,而是把编辑「交回去」由平台应用。
③ 生效时机有讲究
编辑不是立刻可见,理解何时应用很关键。
④ 有若干已知限制
与对象搜索、Automate、可选数组的交互都有注意事项。
0

写在前面

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 编辑函数在底层是如何运作的,帮助你更好地理解其基础设施。

1

编辑何时生效

编辑何时生效

要点:提交后何时真正应用到本体,这决定了你能否立即读到结果。

关于 Ontology 编辑函数,一个常见的误解是:运行它们会不会更新 Ontology 中的对象。当你在 Authoring(创作) 环境的函数助手中运行 Ontology 编辑函数时,编辑不会应用到实际对象上。使用函数更新对象的唯一方式,是按照函数支撑的动作文档所述,将动作配置为使用该函数的形式。

这意味着你可以放心地在函数助手中运行 Ontology 编辑函数,用各种输入验证结果,而不必担心对象本身会被更新。

!Results pane

2

注意事项

注意事项

要点:与对象搜索的配合、在 Automate 里应用、函数动作里的可选数组问题。

对象与链接的变更,会在你的函数执行完毕后才传播到对象集(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)总览」,读者最常问的几个问题。

编辑何时生效?
提交后何时真正应用到本体,这决定了你能否立即读到结果。关于 Ontology 编辑函数,一个常见的误解是:运行它们会不会更新 Ontology 中的对象。
注意事项是什么?
与对象搜索的配合、在 Automate 里应用、函数动作里的可选数组问题。