注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

関数を使用してグラフを生成する

Functions を使用して、1つ以上のオブジェクトから始まり、結果のグラフを返す複雑な Search Around 関数を作成することができます。これらの関数は、Search Around ツールバーメニュー、右クリックメニュー、または URL パラメーターを使用してグラフを作成するとき から実行できます。各関数は、オントロジーオブジェクトタイプまたはオントロジーオブジェクトのリストである1つの引数を必ず持っていなければならず、関数は IGraphSearchAroundResultV1 という戻り値タイプを持っていなければなりません。詳細は以下の通りです。

UI

ツールバーまたは右クリックメニューを通じて使用される場合、関数は IntegerDoubleFloatstringbooleanTimestamp または Date タイプの追加引数を持つことがあります。これらの Search Around を実行すると、ユーザーがこれらのパラメーターを入力するためのフォームが生成されます。

Parameters

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は、関数の周囲を検索することで生成される機能リンクの方向性を変更することができます。提供される値は、NONEFORWARD、またはREVERSEのいずれかでなければなりません。省略された場合、デフォルトでFORWARDになります。linkTypeRidの存在によって表示されるリンクは、directionの影響を受けません。

ヒント & トラブルシューティング

  • パフォーマンスを最大化するために、すべてのコードはできるだけ非同期であるべきです。
  • Vertexは、関数の最新の公開バージョンを使用します。関数を公開するには、ブランチ/コミットにsemverバージョン(例:1.0.0)をタグ付けする必要があります。
  • リポジトリは、関数で使用したいオントロジー内のすべてのオブジェクトとリンクへのアクセスが必要です。これは、リポジトリ設定オントロジーセクションで設定できます。
  • オブジェクトタイプと元データセットがリポジトリとは別のプロジェクトで定義されている場合、リポジトリを含むプロジェクトは、元データセットとそれらのオブジェクトタイプへの参照を持つ必要があります。

トラブルシュート

参考例:

以下の例には、2つのSearch Around関数が含まれています。

最初の関数allFlightsは、空港間のルートに沿ったすべてのフライトを、単一のエッジ上にマージしたものを返します。例えば、ルート "SAN -> FAT" で実行すると、次のようになります。

search_around_functions-all_flights

2番目の関数destinationsは、ユーザーが距離を選択し、その数のフライト内にあるすべての空港を返します。例えば、空港 "[ADK] Adak + Adak Island, AK" で距離が2の場合、次のようになります。

search_around_functions-destinations

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 }; } }