注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Functions を使用して、1つ以上のオブジェクトから始まり、結果のグラフを返す複雑な Search Around 関数を作成することができます。これらの関数は、Search Around ツールバーメニュー、右クリックメニュー、または URL パラメーターを使用してグラフを作成するとき から実行できます。各関数は、オントロジーオブジェクトタイプまたはオントロジーオブジェクトのリストである1つの引数を必ず持っていなければならず、関数は IGraphSearchAroundResultV1
という戻り値タイプを持っていなければなりません。詳細は以下の通りです。
ツールバーまたは右クリックメニューを通じて使用される場合、関数は Integer
、Double
、Float
、string
、boolean
、Timestamp
または Date
タイプの追加引数を持つことがあります。これらの Search Around を実行すると、ユーザーがこれらのパラメーターを入力するためのフォームが生成されます。
Search Around 関数は、TypeScript 関数リポジトリで記述されます。詳細については、Functions documentation を参照してください。
Search Around 関数は、戻り値タイプを IGraphSearchAroundResultV1
または Promise<IGraphSearchAroundResultV1>
として宣言する必要があります。Vertex は、その戻り値タイプの名前と構造を使用して Search Around 関数を発見するため、次のように正確に宣言する必要があります:
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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
// IGraphSearchAroundResultV1というインターフェイスをエクスポートします。これはグラフ検索結果の一部を表します。 export interface IGraphSearchAroundResultV1 { // 直接エッジ。オプションです。 directEdges?: IGraphSearchAroundResultDirectEdgeV1[]; // 中間エッジ。オプションです。 intermediateEdges?: IGraphSearchAroundResultIntermediateEdgeV1[]; // 孤立オブジェクトのRID。オプションです。 orphanObjectRids?: string[]; // グループに対するオブジェクトのRID。オプションです。 objectRidsToGroup?: string[][]; } // IGraphSearchAroundResultDirectEdgeV1というインターフェイスをエクスポートします。これは直接エッジを表します。 export interface IGraphSearchAroundResultDirectEdgeV1 { // ソースオブジェクトのRID sourceObjectRid: string; // ターゲットオブジェクトのRID targetObjectRid: string; // リンクタイプのRID。オプションです。 linkTypeRid?: string; // ラベル。オプションです。 label?: string; // 方向。オプションです。 direction?: string; } // IGraphSearchAroundResultIntermediateEdgeV1というインターフェイスをエクスポートします。これは中間エッジを表します。 export interface IGraphSearchAroundResultIntermediateEdgeV1 { // ソースオブジェクトのRID sourceObjectRid: string; // ソースから中間オブジェクトへのリンクタイプのRID。オプションです。 sourceToIntermediateLinkTypeRid?: string; // 中間オブジェクトのRID intermediateObjectRid: string; // 中間オブジェクトからターゲットオブジェクトへのリンクタイプのRID。オプションです。 intermediateToTargetLinkTypeRid?: string; // ターゲットオブジェクトのRID targetObjectRid: string; // ラベル。オプションです。 label?: string; // 方向。オプションです。 direction?: string; }
directEdges
は、2つのオブジェクト間の直接的なエッジとしてグラフ上に表されます。このエッジがリンクに基づいている場合、オントロジー内のlinkTypeRid
を提供して、このエッジに沿ったリンクタイプの表示名を表示し、エッジの方向をVertexに認識させることができます。intermediateEdges
は、イベントやその他の中間オブジェクトに基づいて2つのオブジェクト間にエッジを作成することができます。中間エッジは、2つのオブジェクト間のエッジとして表され、中間オブジェクトがエッジにグループ化されます。同じ2つのオブジェクト間に多くの中間エッジが返される場合、すべての中間オブジェクトが単一のエッジにグループ化されます。直接エッジの場合と同様に、表現される関係がリンクのペア(ソースオブジェクトから中間オブジェクトへの1つ目、中間オブジェクトからターゲットオブジェクトへの2つ目)に基づいている場合、これらのリンクタイプのRIDを提供することができます。orphanObjectRids
は、リンクが他のオブジェクトと関連がないオブジェクトを返すことができます。directEdges
またはintermediateEdges
のいずれかのエッジに参加するオブジェクトは、ここでは返す必要がありません。objectRidsToGroup
は、オブジェクトRIDの配列を含むグループの配列を返すことで、オブジェクトを単一のノードにグループ化することができます。label
は、ソースオブジェクトとターゲットオブジェクト間の機能リンクにカスタムラベルを指定することができます。direction
は、関数の周囲を検索することで生成される機能リンクの方向性を変更することができます。提供される値は、NONE
、FORWARD
、またはREVERSE
のいずれかでなければなりません。省略された場合、デフォルトでFORWARD
になります。linkTypeRid
の存在によって表示されるリンクは、direction
の影響を受けません。以下の例には、2つのSearch Around関数が含まれています。
最初の関数allFlights
は、空港間のルートに沿ったすべてのフライトを、単一のエッジ上にマージしたものを返します。例えば、ルート "SAN -> FAT" で実行すると、次のようになります。
2番目の関数destinations
は、ユーザーが距離を選択し、その数のフライト内にあるすべての空港を返します。例えば、空港 "[ADK] Adak + Adak Island, AK" で距離が2の場合、次のようになります。
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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
import { Function, Integer, OntologyObject } from "@foundry/functions-api" import { ExampleDataAirport, ExampleDataRoute } from "@foundry/ontology-api"; // グラフ検索結果インターフェース export interface IGraphSearchAroundResultV1 { directEdges?: IGraphSearchAroundResultDirectEdgeV1[]; intermediateEdges?: IGraphSearchAroundResultIntermediateEdgeV1[]; orphanObjectRids?: string[]; objectRidsToGroup?: string[][]; } // グラフ検索結果直接エッジインターフェース export interface IGraphSearchAroundResultDirectEdgeV1 { sourceObjectRid: string; targetObjectRid: string; linkTypeRid?: string; } // グラフ検索結果中間エッジインターフェース export interface IGraphSearchAroundResultIntermediateEdgeV1 { sourceObjectRid: string; sourceToIntermediateLinkTypeRid?: string; intermediateObjectRid: string; intermediateToTargetLinkTypeRid?: string; targetObjectRid: string; } // 頂点検索クラス export class VertexSearchArounds { // すべてのフライトを検索する関数 @Function() public async allFlights(routes: ExampleDataRoute[]): Promise<IGraphSearchAroundResultV1> { const flights = await Promise.all(routes.map(route => route.flights.allAsync()); const intermediateEdges: IGraphSearchAroundResultIntermediateEdgeV1[] = []; for (let i = 0; i < routes.length; i++) { const route = routes[i]; const flightBetweenOriginAndDestination = flights[i]; const sourceObjectRid = route.departingAirport.get().rid!; const targetObjectRid = route.arrivingAirport.get().rid!; for (const flight of flightBetweenOriginAndDestination) { intermediateEdges.push({ sourceObjectRid, intermediateObjectRid: flight.rid!, targetObjectRid, }); } } const result: IGraphSearchAroundResultV1 = { intermediateEdges, }; return result; } // 指定した距離内の目的地を検索する関数 @Function() public async destinations(airport: ExampleDataAirport, distance: Integer): Promise<IGraphSearchAroundResultV1> { let currentDistance = 0; let currentAirports = [airport]; const directEdges: IGraphSearchAroundResultDirectEdgeV1[] = []; while (currentDistance < distance) { let nextAirports = new Set<ExampleDataAirport>(); const routesByAirport = await Promise.all(currentAirports.map(airport => airport.routes.allAsync())); const destinationsByAirport = await Promise.all( routesByAirport.map(routes => Promise.all(routes.map(route => route.arrivingAirport.getAsync())) ) ); for (let i = 0; i < currentAirports.length; i++) { const airport = currentAirports[i]; const destinations = destinationsByAirport[i]; for (const destination of destinations) { directEdges.push({ sourceObjectRid: airport.rid!, targetObjectRid: destination!.rid!, }); } nextAirports.add(destination!); } currentAirports = Array.from(nextAirports); currentDistance++; } return { directEdges }; } }