注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
オントロジーからデータを読み取る関数を書くことに加えて、オブジェクトを作成し、オブジェクト間のプロパティやリンクを編集する関数も書くことができます。 このページでは、関数内で利用可能なオブジェクト編集APIを記載しています。 編集関数の仕組みについて詳しくは、概要ページを参照してください。
関数で作成された編集が実際に適用されるためには、オントロジー編集関数を* function-backed Action *として設定する必要があります。 このようにしてActionを設定することで、追加のメタデータを提供し、権限を設定し、さまざまな運用インターフェースでActionにアクセスすることができます。 ドキュメントに記載されているように、Action外で編集関数を実行しても、実際にはオブジェクトデータを変更することはありません。
編集直後にオブジェクトを検索すると、予期しない結果が返されることがあります。詳細については、注意事項セクションを参照してください。
オントロジーを編集する関数は、次の要件を満たす必要があります:
functions.api
からインポートされた @function(edits=[MyObjectType])
デコレーターを付ける。functions.api
からインポートされた明示的な list[OntologyEdit]
戻り値型ヒントを持つ。Python関数でオントロジーを編集するには、まず OSDKクライアント からオントロジー編集コンテナを構築します。たとえば:
Copied!1 2 3
ontology_edits = FoundryClient().ontology.edits() # FoundryClient() クラスのインスタンスを作成し、ontology 属性の edits メソッドを呼び出している # これはオントロジーの編集操作を扱うためのメソッドであると推測される
このコンテナは、関数内で行われたすべての編集を追跡するために使用されます。
Python 関数内のオントロジー オブジェクトはデフォルトで読み取り専用です。プロパティを変更しようとすると、例外が発生します。
オブジェクトを編集するには、まず既存のオブジェクト インスタンスからオントロジー編集コンテナを使用して、そのオブジェクトの編集可能なビューを取得します。
Copied!1 2
editable_object = edits.objects.MyObjectType.edit(my_object) # 'my_object' を編集可能なオブジェクトに変換し、それを 'editable_object' に代入します。
オブジェクトのプライマリキーが与えられた場合:
Copied!1 2 3
# editable_objectにedits.objects.MyObjectType.editメソッドを使って # オブジェクトのプライマリーキーで編集可能なオブジェクトを取得する editable_object = edits.objects.MyObjectType.edit(object_primary_key)
編集可能なオブジェクトを取得したら、オブジェクトのプロパティ値を再割り当てすることでプロパティ値を編集できます。たとえば:
Copied!1 2
# editable_employeeオブジェクトのlast_name属性をnew_nameで更新する editable_employee.last_name = new_name
同じ関数実行内で後に editable_employee
の last_name
プロパティ値にアクセスすると、先ほど設定された新しい値が返されます。ただし、元の編集不可オブジェクトには変更が反映されません。
編集可能なオブジェクトの配列プロパティは読み取り専用です。配列を変更するには、そのコピーを作成してからコピーを修正し、プロパティを更新してください。
Copied!1 2 3 4 5 6
# 新しい配列にコピー array_copy = list(editable_object.my_array_property) # これでコピーした配列を変更できます array_copy.append(new_item) # それからプロパティの値を上書きします editable_object.my_array_property = array_copy
既存のオブジェクトの主キー プロパティの値は更新できません。
シングルリンクおよびマルチリンク プロパティには、リンクを更新するためのさまざまな方法があります:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# Set an Employee's supervisor # 従業員の上司を設定する editable_employee.supervisor.set(new_supervisor) # Clear an Employee's supervisor # 従業員の上司をクリアする editable_employee.supervisor.clear() # Add a new report to the given employee # 指定された従業員に新しいレポートを追加する editable_employee.reports.add(new_report) # Remove an old report associated with the given employee # 指定された従業員に関連する古いレポートを削除する editable_employee.reports.remove(new_report)
プロパティの更新と同様に、editable_employee
のリンクにアクセスすると、更新後はユーザーが行った変更が反映されます。
オントロジー編集コンテナの MyObjectType.create()
メソッドを使用して、新しいオブジェクトを作成できます。新しいオブジェクトを作成する際には、そのプライマリキーの値を指定する必要があります。
この例では、指定された ID を持つ新しいチケットオブジェクトを作成し、その due_date
プロパティを設定し、assigned_tickets
リンクを変更して指定された従業員に割り当てます。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
from datetime import datetime, timedelta from functions.api import function, Integer, Array, OntologyEdit from ontology_sdk import FoundryClient from ontology_sdk.ontology.objects import Employee, Ticket @function(edits=[Employee, Ticket]) def create_new_ticket_and_assign_to_employee( employee: Employee, ticket_id: Integer ) -> list[OntologyEdit]: # FoundryClientを使用してontology_editsのインスタンスを作成 ontology_edits = FoundryClient().ontology.edits() # 新しいチケットを作成し、7日後の期限を設定 new_ticket = ontology_edits.objects.Ticket.create(ticket_id) new_ticket.due_date = datetime.now() + timedelta(days=7) # 編集可能なEmployeeオブジェクトを取得し、新しいチケットを割り当て editable_employee = ontology_edits.objects.Employee.edit(employee) editable_employee.assigned_tickets.add(new_ticket) # 変更内容を返す return ontology_edits.get_edits()
プロパティ値は、主キーに加えて create メソッドに直接渡すこともできます。たとえば:
Copied!1 2 3 4 5
# 現在の日付と時刻に7日間を加算して、新しい期限日を設定 new_due_date = datetime.now() + timedelta(days=7) # チケットを作成し、新しい期限日を設定 new_ticket = ontology_edits.objects.Ticket.create(ticket_id, due_date=new_due_date)
オントロジー編集コンテナで MyObjectType.delete()
メソッドを呼び出すことで、オブジェクトを削除できます。
この例では、指定された従業員に割り当てられたすべてのチケットを削除します:
Copied!1 2
for ticket in employee.tickets: ontology_edits.objects.Ticket.delete(ticket) # 各従業員のチケットを削除する
オブジェクトは、インスタンスの代わりにプライマリキーを使用して削除することもできます。
Copied!1 2
ontology_edits.objects.Ticket.delete(ticket_id) # 指定されたticket_idのチケットオブジェクトを削除する