

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 空間データ
<a name="access-graph-opencypher-22-spatial-data"></a>

Amazon Neptune は空間クエリをサポートするようになり、グラフにジオメトリデータを保存および分析できるようになりました。地理的位置 (マップ上の座標など) に一般的に使用されますが、空間特徴は位置と近接性が重要な任意の 2 次元データで機能します。この機能を使用して、「この顧客から 5 マイル以内の店舗はどれですか？」、「このサービスエリアと交差するすべての配送ルートを見つける」、「この間取り図のどのコンポーネントが HVAC ゾーンと重複していますか？」などの質問に回答します。Neptune は、ポイント、ポリゴン、その他の幾何学的形状で動作する業界標準の空間型関数を使用して空間サポートを実装します。空間データをノードとエッジのプロパティとして保存し、空間関数を使用して距離を計算したり、ポイントが境界内にあるかどうかを確認したり、重複する領域を検索したりできます。これらはすべて openCypher クエリ内にあります。

**一般的なユースケース:**
+ **地理的アプリケーション**: ロケーションベースのレコメンデーション、ジオフェンシング、ルートプランニング、および地域分析
+ **施設とスペースの管理**: 間取り図のレイアウト、機器の配置、ゾーンカバレッジ
+ **ネットワークトポロジ**: 物理インフラストラクチャマッピング、カバレッジエリア、サービス境界
+ **設計と CAD**: 2D 設計におけるコンポーネントの配置、衝突検出、空間関係
+ **ゲーム開発**: キャラクターの配置、衝突検出、area-of-effectの計算

Amazon Neptune の空間型実装は、他のデータベースと同様に ISO/IEC 13249-3:2016 ディレクティブに従います。[空間関数](access-graph-opencypher-22-spatial-functions.md) は openCypher クエリ言語で使用できます。

## 座標系
<a name="access-graph-opencypher-22-spatial-data-coordinate-system"></a>

Neptune には、データベース全体に 1 つの空間参照識別子 (SRID) があります。座標系の同種性により、クエリ中のユーザーエラーが軽減され、データベースのパフォーマンスが向上します。最初のリリース (1.4.7.0) では、SRID 0 とも呼ばれるデカルト座標系がサポートされています。

SRID 0 の Neptune 実装は、経度と緯度の値と互換性があります。を使用して`ST_DistanceSpheroid`、WGS84/SRID 4326 に基づいて距離を計算します。

現在の実装では、3 次元座標の保存がサポートされています。Spatial Functions は現在、x 軸および y 軸 (2 次元) 座標の使用のみをサポートしています。z 軸座標は現在、使用可能な空間関数ではサポートされていません。

## 位置データの保存
<a name="storing-spatial-data"></a>

Geometry プロパティタイプを使用して、ノードとエッジに位置データを保存します。Well-Known Text (WKT) 形式からジオメトリ値を作成します。これは、地理的なシェイプをテキストとして表す標準的な方法です。たとえば、ポイントの場所を保存するには:

```
CREATE (n:airport {code: 'ATL', location: ST_GeomFromText('POINT (-84.4281 33.6367)')})
```

地理的座標を使用する場合、最初の引数 (x) は経度を表し、2 番目の引数 (y) は緯度を表します。これは、空間データベースで使用される標準の座標順序と ISO 19125 標準に従います。

**注記**  
 Neptune は、「ジオメトリ」と呼ばれる新しいデータ型をサポートするようになりました。ノードまたはエッジのジオメトリプロパティは、 `ST_GeomFromText`関数を使用して WKT 文字列から作成できます。  
Neptune は、特殊な空間インデックスにポイントデータを自動的に保存し、空間型関数のパフォーマンスを向上させます。例えば、ポリゴン内のポイントを見つける`ST_Contains`ために使用される は、特殊な空間インデックスによって加速されます。  
[ Well-Known Text によるジオメトリ表現の Wikipedia ページ ](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry)

## 空間データを一括でロードする
<a name="loading-spatial-data-bulk"></a>

データを一括ロードする場合は、CSV ヘッダーでジオメトリタイプを指定します。Neptune は WKT 文字列を解析し、適切なジオメトリプロパティを作成します。

```
:ID,:LABEL,code:String,city:String,location:Geometry
21,airport,ATL,Atlanta,POINT (-84.42810059 33.63669968)
32,airport,ANC,Anchorage,POINT (-149.9960022 61.17440033)
43,airport,AUS,Austin,POINT (-97.66989899 30.19449997)
```

CSV 形式の詳細については、[openCypher bulk load format](bulk-load-tutorial-format-opencypher.md)」を参照してください。

## 空間データのクエリの実行
<a name="querying-spatial-data"></a>

次のクエリ例では、[エアルートデータセット](https://github.com/krlawrence/graph/tree/main/sample-data)を使用して、Neptune で空間関数を使用する方法を示します。

データに Geometry プロパティではなく個別の緯度プロパティと経度プロパティがある場合は、クエリ時にポイントに変換できます。特定の場所に最も近い 10 の空港を見つけます。

```
MATCH (a:airport)
WITH a, ST_GeomFromText('POINT (' + a.lon + ' ' + a.lat + ')') AS airportLocation
WITH a, airportLocation, ST_Distance(ST_GeomFromText('POINT (-84.4281 33.6367)'), airportLocation) AS distance
WHERE distance IS NOT NULL
RETURN a.code, a.city, distance
ORDER BY distance ASC
LIMIT 10
```

として保存されているロケーションがすでにある場合は`ST_Point`、それらのロケーション値を直接使用できます。

1.  プロパティの設定

   ```
   MATCH (a:airport)
   SET a.location = ST_GeomFromText('POINT (' + a.lon + ' ' + a.lat + ')')
   ```

1. ST\_Distance を使用したクエリ:

   ```
   MATCH (a:airport)
   WHERE a.location IS NOT NULL
   WITH a, ST_Distance(ST_GeomFromText('POINT (-84.4281 33.6367)'), a.location) AS distance
   RETURN a.code, a.city, distance
   ORDER BY distance ASC
   LIMIT 10
   ```

### Bolt ドライバーの使用
<a name="querying-spatial-data-bolt"></a>

ほとんどのクエリメソッドは、ジオメトリ値を人間が読み取り可能な WKT 文字列として返します。Bolt ドライバーを使用している場合、ジオメトリ値は WKB (Well-Known Binary) 形式で返されます。WKB をアプリケーションの Geometry オブジェクトに変換します。

```
try (Session session = driver.session()) {
    Result result = session.run("MATCH (n:airport {code: 'ATL'}) RETURN n.location as geom");
    
    Record record = result.single();
    byte[] wkbBytes = record.get("geom").asByteArray();
    
    // Convert WKB to Geometry object using JTS library
    WKBReader wkbReader = new WKBReader();
    Geometry geom = wkbReader.read(wkbBytes);
}
```