循序渐进 · 教学 · 派生属性

派生属性(Derived Properties)入门

有些值不必手动维护——比如"这个客户名下有多少笔订单"。派生属性让你在运行时自动算出来。这一篇讲清它是什么、能算什么、为什么安全,并用一个实验室让你亲手感受它的价值。

原文 Derived properties 预计阅读 9 分钟 互动演示 + 6 道测验
本文来源 · Source 内容整理自 Palantir Foundry 官方文档:
https://www.palantir.com/docs/foundry/ontology/derived-properties/
原始标题:Derived properties

一句话速览

派生属性(Derived Properties)入门:有些值不必手动维护——比如"这个客户名下有多少笔订单"。派生属性让你在运行时自动算出来。这一篇讲清它是什么、能算什么、为什么安全,并用一个实验室让你亲手感受它的价值。

1 运行时现算的值
派生属性(derived property)是在运行时(runtime)根据其他属性或链接(links)计算出来的属性
2 少了一样东西
简言之:存储属性是"记账本上写死的数字",派生属性是"每次打开都重新数一遍的结果"
3 查表与聚合
派生属性的核心,是"顺着链接去算"
4 不会"算"出越权数据
派生属性在计算时,会沿用参与计算的所有对象的安全策略(security)
1

什么是派生属性:运行时现算的值

它不存数据,而是"根据别的东西算出来"。

派生属性(derived property)是在运行时(runtime)根据其他属性或链接(links)计算出来的属性。它不单独存储,而是在被需要时现算——比如"聚合某个链接对象上的属性",或"从被链接的对象上挑选一个属性值"。

Derived properties are properties that are calculated at runtime based on the values of other properties or links on objects.派生属性是在运行时,根据对象上其他属性或链接的值计算出来的属性。
Beta 提示:派生属性目前处于 Beta 阶段,可能不在你的环境可用,且功能在持续演进。本文以官方文档已公开的内容为准。
2

和"存储属性"的区别:少了一样东西

普通属性要靠人/动作去填;派生属性自己会算。

普通(存储)属性
totalOrders = 42 这个值要由数据源导入,或由动作(action)在每次增删时去更新;忘了更新就会失真。
派生属性
ordersCount = 现算 根据"该客户链接的订单对象"实时算出,永远跟着底层数据走,无需手动维护。

简言之:存储属性是"记账本上写死的数字",派生属性是"每次打开都重新数一遍的结果"。

3

它能算什么:查表与聚合

根据链接是一对一还是一对多,玩法不同。

派生属性的核心,是"顺着链接去算"。链接的形态决定了能做什么:

单链接:查表(select)
顺着"多对一"链接,从被链接的那单个对象上取一个属性值。例如从"订单"指向的"客户",取客户的姓名作为订单上的派生属性。
多链接:聚合(aggregate)
顺着"一对多"链接,对那一组链接对象做统计。常见运算包括计数(count)、求和(sum)、平均(average)、最大(max)、最小(min)等。
关键点:算出来的派生属性还能在本请求内继续被过滤、排序、再聚合,形成一条计算链。
4

安全特性:不会"算"出越权数据

它沿用参与计算的所有对象的安全策略。

派生属性在计算时,会沿用参与计算的所有对象的安全策略(security)。换句话说,如果一个用户本来看不到某个链接对象,那么在派生属性里也不会因为"聚合/查表"而意外看到它。

Derived properties use the security of all objects involved in the calculation, so they do not expose information a user would otherwise be unable to see.派生属性沿用计算所涉所有对象的安全策略,因此不会暴露用户本无权查看的信息。
提示:这让派生属性能安全地替代很多"预先算好再存储"的方案,又不破坏权限边界。
5

实验室:手动计数器 vs 派生属性

亲手点几下,感受"自动"和"手动"的差距。

实验室:手动维护的计数器 vs 派生属性
手动维护的计数器 totalOrders
0
每次增删都要记得点"同步"去更新;忘了就和实际对不上。
尚未同步
派生属性 ordersCount(实时计算)
0
运行时根据链接的订单对象自动算,永远等于真实数量。
始终准确

先点几次"新增订单":左边手动计数器不会自己变,右边派生属性立刻跟上。记得再点"同步"让手动值对齐。

对照结论:手动计数器依赖人的纪律,派生属性依赖系统计算——后者在订单频繁变动时几乎不会出错。
6

在哪用、有哪些限制

知道边界,才不会在错误的地方依赖它。

在哪用:在 Ontology Manager 中为一个对象类型配置派生属性(选择基于哪个链接、做查表还是聚合);在代码侧,TypeScript OSDK 通过 withProperties 操作使用它(需 @osdk/client2.2.0-beta.x 及以上版本),用于返回或在后续过滤、聚合、排序中使用。

当前已知限制(Beta):文档列出了这些边界——

  • OSv1:含派生属性的查询不能包含仍用 OSv1 索引的对象类型。
  • 文本搜索:派生属性不能用于文本搜索或关键词过滤。
  • Structs:在 TypeScript OSDK 中,含派生属性的查询暂不能包含 struct 类型属性(可用 $select 排除)。
  • Marketplace:使用派生属性的函数暂不支持 Marketplace。
记忆点:派生属性擅长"算",但不擅长"被搜索"。为什么文本搜索用不了 →

一页带走

① 运行时现算
派生属性不存储,按其他属性或链接在运行时计算,免去手动维护。
② 查表与聚合
单链接查表取值,多链接做 count/sum/average/max/min 等聚合。
③ 安全不越权
沿用参与计算对象的安全策略,不会算出用户本看不到的数据。
④ 边界要记牢
Beta 阶段:不能文本搜索、暂不支持 OSv1/Struct/Marketplace 相关用法。

延伸阅读 · 相关页面

按主题横向跳转,不必顺着目录一篇篇读。

常见问题速答 · FAQ

关于「派生属性(Derived Properties)入门」,读者最常问的几个问题。

什么是派生属性:运行时现算的值?
派生属性(derived property)是在运行时(runtime)根据其他属性或链接(links)计算出来的属性。它不单独存储,而是在被需要时现算——比如"聚合某个链接对象上的属性",或"从被链接的对象上挑选一个属性值"。
和"存储属性"的区别:少了一样东西是什么?
简言之:存储属性是"记账本上写死的数字",派生属性是"每次打开都重新数一遍的结果"。
它能算什么:查表与聚合?
派生属性的核心,是"顺着链接去算"。链接的形态决定了能做什么。
安全特性:不会"算"出越权数据是什么?
派生属性在计算时,会沿用参与计算的所有对象的安全策略(security)。换句话说,如果一个用户本来看不到某个链接对象,那么在派生属性里也不会因为"聚合/查表"而意外看到它。