オントロジーの構築概要オントロジーオブジェクトマップ検索の周辺

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

マップ検索の周辺

周辺検索は、リンクまたは関数を利用した検索で、ユーザーが関連するオブジェクトを探索できるようにします。

リンク周辺検索

ユーザーは、任意の地理空間オブジェクトからリンクされている任意の地理空間オブジェクトに対して周辺検索を行うことができます。詳細は、リンクタイプの作成を参照してください。

リンクマージされた周辺検索

Mapアプリケーションは、仲介オブジェクト(非地理空間オブジェクトである可能性もある)を介して地理空間オブジェクトが他の地理空間オブジェクトにリンクされる2段階の周辺検索を実行できます。

  • 仲介オブジェクトは、2つのオブジェクト間の関係を表している場合があります。たとえば、FactoryオブジェクトとSupplierオブジェクトはSupply Contractオブジェクトを介して関連している場合があります。この場合、周辺検索が実行されると、Mapは工場から供給元への弧を表示し、この弧が供給契約を表します。
  • 仲介オブジェクトは、両方のオブジェクトが関与するイベントである場合もあります。たとえば、CustomerオブジェクトはDistribution CenterオブジェクトにDeliveryイベントを介してリンクされる場合があります。この場合、配達イベントは弧に沿って移動する円として表示されます。円の位置は、イベントの開始時間と終了時間、および現在選択されているタイムスタンプに基づいて弧に沿って補間されます。

リンクマージされた弧の例

リンクマージされた周辺検索に使用するオブジェクトを構成する方法は2つあります。

  • 仲介オブジェクトをリンクマージオブジェクトとして指定する。この方法では、このオブジェクトタイプ自体は周辺検索リストに表示されず、その推移的リンクのみが表示されます。
  • 特定のリンクトラバーサルをマージする。この方法を使用すると、仲介オブジェクトの関係の一部のみをリンクマージすることができます。

仲介オブジェクトタイプを常にリンクマージするように設定

仲介オブジェクトタイプを常にリンクマージするように指定するには、仲介オブジェクトタイプの機能タブの周辺検索セクションで常にリンクマージをオンにします。これにより、オブジェクトタイプ自体は周辺検索リストに表示されず、その推移的リンクのみが表示されます。

オントロジーマネージャーでのリンクマージの設定

たとえば、仲介オブジェクトタイプがDeliveryで、両側のオブジェクトタイプがDistribution CenterCustomerである場合、Distribution Centerを周辺検索の対象として選択すると、Deliveryはリストに表示されませんが、Customer (via Delivery)が表示されます。以下はその例です。

リンクマージされたオブジェクトの周辺検索メニュー

特定のリンクトラバーサルをリンクマージとして設定

特定のリンクトラバーサルをリンクマージとして指定するには、仲介オブジェクトタイプの機能タブの周辺検索セクションでマージする受信リンクマージする送信リンクの両方を指定します。

オントロジーマネージャーでの受信/送信リンクマージの設定

たとえば、Deliveryオブジェクトタイプを介してSupplierオブジェクトタイプからDistribution Centerオブジェクトタイプへの周辺検索を実行できるようにする場合は、Deliveryオブジェクトタイプを仲介オブジェクトとして構成し、Delivery <-> Supplierリンクをマージする受信リンクとして、Delivery <-> Distribution Centerリンクをマージする送信リンクとして選択します。これにより、Supplierを周辺検索の対象として選択したときに、Distribution Centers (via Delivery)がリストにオプションとして表示されます。

リンクトラバーサルの両方向を周辺検索リストに表示したい場合(たとえば、SuppliersDistribution Centers (via Delivery)を、Distribution CentersSuppliers (via Delivery)を表示する場合)、これらのリンクをマージする受信リンクおよびマージする送信リンクの両方として構成する必要があります。

周辺検索関数

TypeScript関数を記述することで、強力なマップ周辺検索を作成できます。これにより、選択されたオブジェクトを取得し、オントロジーをトラバースして特定の分析に関連または有用なすべてのオブジェクトを返すTypeScript関数を記述できます。

マップ周辺検索関数は、次のデータ構造を返すことができます。

  • objectRids: マップに追加されるオブジェクト。
  • edges: エッジは、ソースオブジェクト、ターゲットオブジェクト、およびオプションで仲介オブジェクトを含みます。ソースオブジェクトとターゲットオブジェクトはマップに追加され、これらの間に弧が描かれます。仲介オブジェクトは弧が選択されたときにリストに表示されます。
  • measures: time series メジャーは、series パネルに追加されます。

マップ周辺検索関数の実装

マップ周辺検索関数は、TypeScript関数のリポジトリで開発されます。詳細については、関数のドキュメントを参照してください。

戻り型

マップ周辺検索関数は、Promise<IMapSearchAroundResults>の戻り型を宣言する必要があります。Mapアプリケーションは、戻り型の名前と構造を使用して周辺検索関数を検出するため、戻り型は次のように正確に宣言する必要があります。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // 周辺検索の結果を表すインターフェース export interface IMapSearchAroundResults { objectRids?: string[]; // 検索結果のオブジェクトのRID(リソースID)の配列 edges?: IMapSearchAroundEdge[]; // 検索結果に関連するエッジの配列 measures?: IMapSearchAroundMeasure[]; // 検索結果に関連する測定値の配列 } // 周辺検索で見つかったエッジを表すインターフェース export interface IMapSearchAroundEdge { sourceObjectRid: string; // エッジの始点となるオブジェクトのRID targetObjectRid: string; // エッジの終点となるオブジェクトのRID intermediaryObjectRids?: string[]; // 中間に存在するオブジェクトのRIDの配列(任意) } // 周辺検索で見つかった測定値を表すインターフェース export interface IMapSearchAroundMeasure { objectRids: string[]; // 測定値に関連するオブジェクトのRIDの配列 measureId: string; // 測定値のID }

パラメーター

Map Search Around 関数には、次のいずれかの 1 個 (かつ 1 個のみ) のオブジェクトパラメーターを含める必要があります。

  • 単一のオブジェクト: この Search Around 関数は、指定されたタイプの単一のオブジェクトが選択されている場合に Search Around メニューで利用可能になります。たとえば:
Copied!
1 2 3 4 public exampleSearchAround(object: ExampleObjectType) { // 周囲を検索する例 ... }
  • オブジェクト配列: 特定のタイプのオブジェクトが 1 個でも選択されている場合、この「周辺検索」機能は「周辺検索」メニューで利用できます。たとえば:
Copied!
1 2 public exampleSearchAround(objects: ExampleObjectType[]) { ... // ExampleObjectTypeの配列を受け取って、周囲を探索するメソッド
  • オブジェクトセット: 指定されたタイプの任意の数のオブジェクトが選択されているときに、このSearch Around機能がSearch Aroundメニューで利用可能になります。たとえば:
Copied!
1 2 public exampleSearchAround(objectSet: ObjectSet<ExampleObjectType>) { ... // exampleSearchAroundメソッドは、ExampleObjectTypeのオブジェクトセットを引数に取ります。

Map Search Around 関数には、任意の数の追加パラメーターを含めることができます。これらのスカラー型には、stringbooleanIntegerLongFloatDoubleLocalDate、または Timestamp があります (詳細については スカラー型 を参照してください)。ユーザーが追加のパラメーターを指定して Search Around 関数を実行すると、パラメーターの値を入力するように求められます。たとえば:

Copied!
1 2 3 4 5 6 public exampleSearchAround(objectSet: ObjectSet<ExampleObjectType>, stringParameter: string, timestampParameter: Timestamp) { // objectSet: ExampleObjectTypeのオブジェクト集合 // stringParameter: 検索条件として使う文字列パラメータ // timestampParameter: 検索条件として使うタイムスタンプパラメータ ... }

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

  • パフォーマンスを最大化するために、すべてのコードは可能な限り非同期にする必要があります。関数コードでは、オブジェクトをロードするときに all()get() の代わりに常に allAsync()getAsync() を使用し、 await ステートメントをできるだけ少なく使用してください。
  • Map アプリケーションは関数の最新の公開バージョンを使用します。関数を公開するには、semver互換のバージョン (たとえば: 1.0.0) でタグを付ける必要があります。
  • リポジトリは、関数で使用したいすべてのオントロジーオブジェクトとリンクにアクセスする必要があります。これはリポジトリの SettingsOntology セクションで設定できます。
  • オブジェクトタイプとその元データセットがリポジトリとは異なるプロジェクトで定義されている場合、そのリポジトリを含むプロジェクトは元データセットとそれらのオブジェクトタイプへのリファレンスが必要です。

この例のコードには、Foundry Reference Project のサンプルデータに基づいた 3 つの Search Around 関数が含まれています:

  • airportsRelatedObjects: 一連の空港に関連するさまざまなオブジェクトを返します。空港分析のための地図テンプレートで使用できます。
  • nearbyAirports: 指定された距離内にある他の空港を見つけるために地理空間検索を実行します。この関数はオプションの距離パラメーターを受け取り、関数を実行する際にユーザーが距離を指定できるようにします。
  • routesBetweenAirports: 一連の空港を指定すると、その空港間のすべてのルートを返します。
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 97 import { Distance, Function, Integer, Filters } from "@foundry/functions-api"; import { ObjectSet, Objects, ExampleDataAirport } from "@foundry/ontology-api"; export interface IMapSearchAroundResults { objectRids?: string[]; edges?: IMapSearchAroundEdge[]; measures?: IMapSearchAroundMeasure[]; } export interface IMapSearchAroundEdge { sourceObjectRid: string; targetObjectRid: string; intermediaryObjectRids?: string[]; } export interface IMapSearchAroundMeasure { objectRids: string[]; measureId: string; } export class MapSearchAroundFunctions { /** * Return relevant objects for airports: runways, routes * 空港に関連するオブジェクトを返す: 滑走路、ルート */ @Function() public async airportsRelatedObjects(airportSet: ObjectSet<ExampleDataAirport>): Promise<IMapSearchAroundResults> { const relatedObjects = (await Promise.all([ airportSet.searchAroundExampleDataRunway().allAsync(), airportSet.searchAroundRoutes().allAsync(), ])).flat(); const objectRids = relatedObjects.map(o => o.rid!); return { objectRids, }; } /** * Return all airports within the specific number of kilometres of the selected airport (defaulting to 50) * 選択された空港から特定の距離(デフォルトは50km)以内にあるすべての空港を返す */ @Function() public async nearbyAirports(airport: ExampleDataAirport, distanceKm?: Integer): Promise<IMapSearchAroundResults> { const point = airport.airportLocation; const distance = Distance.ofKilometers(distanceKm ?? 50); if (point === undefined) { return {}; } const nearbyAirports = await Objects.search() .exampleDataAirport() .filter(airportFilter => airportFilter.airportLocation.withinDistanceOf(point, distance)) .allAsync(); const objectRids = nearbyAirports.map(o => o.rid!); return { objectRids, }; } /** * Return only routes that depart from and arrive in the selected airports * 選択された空港間のルートのみを返す */ @Function() public async routesBetweenAirports(airportSet: ObjectSet<ExampleDataAirport>): Promise<IMapSearchAroundResults> { const airports = await airportSet.allAsync(); const airportCodes = airports.map(airport => airport.airport); const airportsByCodes = new Map(Array.from(airports, a => [a.airport, a])); const routes = await Objects.search() .exampleDataRoute() .filter(route => Filters.and( route.origin.exactMatch(...airportCodes), route.dest.exactMatch(...airportCodes), )) .allAsync(); const edges = routes.map(route => ({ sourceObjectRid: airportsByCodes.get(route.origin!)!.rid!, targetObjectRid: airportsByCodes.get(route.dest!)!.rid!, intermediaryObjectRids: [route.rid!], })); return { edges }; } }