

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

# 空間データ
<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 は、「ジオメトリ」と呼ばれる新しいデータ型をサポートするようになりました。ノードまたはエッジの Geometry プロパティは、 `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\$1Distance を使用したクエリ:

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

# 空間関数
<a name="access-graph-opencypher-22-spatial-functions"></a>

Neptune openCypher では、ジオメトリデータ型を操作するために次の空間関数を使用できます。
+ [ST\$1Point](access-graph-opencypher-22-spatial-functions-st-point.md)
+ [ST\$1GeomFromText](access-graph-opencypher-22-spatial-functions-st-geomfromtext.md)
+ [ST\$1AsText](access-graph-opencypher-22-spatial-functions-st-astext.md)
+ [ST\$1GeometryType](access-graph-opencypher-22-spatial-functions-st-geometrytype.md)
+ [ST\$1Equals](access-graph-opencypher-22-spatial-functions-st-equals.md)
+ [ST\$1Contains](access-graph-opencypher-22-spatial-functions-st-contains.md)
+ [ST\$1Intersects](access-graph-opencypher-22-spatial-functions-st-intersect.md)
+ [ST\$1Distance](access-graph-opencypher-22-spatial-functions-st-distance.md)
+ [ST\$1DistanceSpheroid](access-graph-opencypher-22-spatial-functions-st-distancespheroid.md)
+ [ST\$1Envelope](access-graph-opencypher-22-spatial-functions-st-envelope.md)
+ [ST\$1Buffer](access-graph-opencypher-22-spatial-functions-st-buffer.md)

# ST\$1Point
<a name="access-graph-opencypher-22-spatial-functions-st-point"></a>

ST\$1Point は、入力座標値からポイントを返します。

**[Syntax]** (構文)

```
ST_Point(x, y, z)
```

**引数**
+ `x` - 最初の座標を表すデータ型 DOUBLE PRECISION の値。
+ `y` - 2 番目の座標を表すデータ型 DOUBLE PRECISION の値。
+ `z` - (オプション)

**座標順序**

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

```
// Correct: longitude first, latitude second
ST_Point(-84.4281, 33.6367)  // Atlanta airport

// Incorrect: latitude first, longitude second
ST_Point(33.6367, -84.4281)  // This will return NaN in distance calculations
```

**有効な座標範囲**

地理的データの場合、座標が有効な範囲内にあることを確認します。
+ 経度 (`x`): -180～180
+ 緯度 (`y`): -90～90

これらの範囲外の座標は、 などの距離計算関数で使用すると `NaN` (数値ではない) を返します`ST_DistanceSpheroid`。

**戻り型**

サブタイプ POINT の GEOMETRY

*x* または *y* が null の場合、null が返されます。

**例**

次の は、入力座標からポイントジオメトリを構築します。

```
RETURN ST_Point(5.0, 7.0); 
POINT(5 7)
```

# ST\$1GeomFromText
<a name="access-graph-opencypher-22-spatial-functions-st-geomfromtext"></a>

ST\$1GeomFromText は、入力ジオメトリの WKT (Well-Known Text) 表現からジオメトリオブジェクトを作成します。

**[Syntax]** (構文)

```
ST_GeomFromText(wkt_string)
```

**引数**
+ `wkt_string` - ジオメトリの WKT 表現であるデータ型 STRING の値。

**戻り型**

GEOMETRY

wkt\$1string が null の場合、null が返されます。

wkt\$1string が有効でない場合、BadRequestException が返されます。

**例**

```
RETURN ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))')             
POLYGON((0 0,0 1,1 1,1 0,0 0))
```

# ST\$1AsText
<a name="access-graph-opencypher-22-spatial-functions-st-astext"></a>

ST\$1AsText は、入力ジオメトリの WKT (Well-Known Text) 表現を返します。

**[Syntax]** (構文)

```
ST_AsText(geo)
```

**引数**
+ `geo` - データ型 GEOMETRY の値、または GEOMETRY に評価される式。

**戻り型**

STRING

geo が null の場合、null が返されます。

入力パラメータがジオメトリでない場合、BadRequestException が返されます。

結果が 64-KB STRING より大きい場合、エラーが返されます。

**例**

```
RETURN ST_AsText(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))'))             
POLYGON((0 0,0 1,1 1,1 0,0 0))
```

# ST\$1GeometryType
<a name="access-graph-opencypher-22-spatial-functions-st-geometrytype"></a>

ST\$1GeometryType は、ジオメトリのタイプを文字列として返します。

**[Syntax]** (構文)

```
ST_GeometryType(geom)
```

**引数**
+ `geom` - データ型 GEOMETRY の値、または GEOMETRY 型に評価される式。

**戻り型**

STRING

geom が null の場合、null が返されます。

入力パラメータがジオメトリでない場合、BadRequestException が返されます。

**例**

```
RETURN ST_GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
ST_LineString
```

# ST\$1Equals
<a name="access-graph-opencypher-22-spatial-functions-st-equals"></a>

ST\$1Equals は、入力ジオメトリの 2D 射影がトポロジ的に等しい場合に true を返します。ジオメトリに等しいポイントセットがある場合、ジオメトリはトポロジ的に等しいと見なされます。トポロジ的に等しいジオメトリでは、この等価性を維持しながら頂点の順序が異なる場合があります。

**[Syntax]** (構文)

```
ST_Equals(geom1, geom2)
```

**引数**
+ `geom1` - データ型 GEOMETRY の値、または GEOMETRY 型に評価される式。
+ `geom2` - データ型 GEOMETRY の値、または GEOMETRY 型に評価される式。この値を *geom1* と比較して、*geom1* と等しいかどうかを判断します。

**戻り型**

BOOLEAN

*geom1* または *geom2* が null の場合、null が返されます。

geom1 または geom2 が Geometries でない場合、BadRequestException が返されます。

**例**

```
RETURN ST_Equals(
    ST_GeomFromText('POLYGON ((0 2,1 1,0 -1,0 2))'), 
    ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
false
```

次の は、2 つのライン文字列が幾何学的に等しいかどうかを確認します。

```
RETURN ST_Equals(
    ST_GeomFromText('LINESTRING (1 0, 10 0)'), 
    ST_GeomFromText('LINESTRING(1 0,5 0,10 0)'));
true
```

# ST\$1Contains
<a name="access-graph-opencypher-22-spatial-functions-st-contains"></a>

ST\$1Contains は、最初の入力ジオメトリの 2D 投影に、2 番目の入力ジオメトリの 2D 投影が含まれている場合に true を返します。ジオメトリ A は、B のすべてのポイントが A のポイントであり、内部に空の交差がない場合にジオメトリ B を含みます。ST\$1Contains(A, B) は ST\$1Within(B, A) と同等です。

**[Syntax]** (構文)

```
ST_Contains(geom1, geom2)
```

**引数**
+ `geom1` - GEOMETRY 型の値、または GEOMETRY 型に評価される式。
+ `geom2` - GEOMETRY 型の値、または GEOMETRY 型に評価される式。この値を *geom1* と比較して、*geom1* に含まれているかどうかを判断します。

**戻り型**

BOOLEAN

*geom1* または *geom2* が null の場合、null が返されます。

入力パラメータがジオメトリでない場合、BadRequestException が返されます。

**例**

```
RETURN ST_Contains(
    ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), 
    ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
false
```

# ST\$1Intersects
<a name="access-graph-opencypher-22-spatial-functions-st-intersect"></a>

ST\$1Intersects は、2 つの入力ジオメトリの 2D 射影が少なくとも 1 つの共通したポイントを持つ場合、true を返します。

**[Syntax]** (構文)

```
ST_Intersects(geom1, geom2)
```

**引数**
+ `geom1` - データ型 GEOMETRY の値、または GEOMETRY 型に評価される式。
+ `geom2` - データ型 GEOMETRY の値、または GEOMETRY 型に評価される式。

**戻り型**

BOOLEAN

*geom1* または *geom2* が null の場合、null が返されます。

入力パラメータがジオメトリでない場合、BadRequestException が返されます。

**例**

```
RETURN ST_Intersects(
    ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(2 2,2 5,5 5,5 2,2 2))'), 
    ST_GeomFromText('MULTIPOINT((4 4),(6 6))'));
true
```

# ST\$1Distance
<a name="access-graph-opencypher-22-spatial-functions-st-distance"></a>

入力がジオメトリの場合、ST\$1Distance は 2 つのジオメトリの 2D 射影による値の間で、最短のユークリッド距離を返します。

**[Syntax]** (構文)

```
ST_Distance(geo1, geo2)
```

**引数**
+ `geo1` - データ型 GEOMETRY の値、または GEOMETRY 型に評価される式。
+ `geo2` - データ型 GEOMETRY の値、または GEOMETRY に評価される式。

**戻り型**

入力ジオメトリと同じ単位の DOUBLE PRECISION。

geo1 または geo2 が null の場合、null が返されます。

入力パラメータがジオメトリでない場合、BadRequestException が返されます。

**例**

```
RETURN ST_Distance(
    ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), 
    ST_GeomFromText('POLYGON((-1 -3,-2 -1,0 -3,-1 -3))'));
1.4142135623731
```

# ST\$1DistanceSpheroid
<a name="access-graph-opencypher-22-spatial-functions-st-distancespheroid"></a>

2 つの lon/lat ジオメトリ間の最小距離をメートル単位で返します。スフェロイドは WGS84/SRID 4326 です。

**[Syntax]** (構文)

```
ST_DistanceSpheroid(geom1, geom2);
```

**引数**
+ `geom1` - データ型 GEOMETRY の値、または GEOMETRY 型に評価される式。
+ `geom2` - データ型 GEOMETRY の値、または GEOMETRY 型に評価される式。

**戻り型**

FLOAT

geom が null の場合、null が返されます。

**例**

```
RETURN ST_DistanceSpheroid(
    ST_GeomFromText('POINT(-110 42)'),
    ST_GeomFromText('POINT(-118 38)'))
814278.77
```

# ST\$1Envelope
<a name="access-graph-opencypher-22-spatial-functions-st-envelope"></a>

ST\$1Envelope は、次のように、入力ジオメトリの最小の境界ボックスを返します。
+ 入力ジオメトリが空の場合、返されるジオメトリは POINT EMPTY になります。
+ 入力ジオメトリの最小の境界ボックスに含まれるのが 1 つのポイントのみの場合、返されるジオメトリは 1 つのポイントです。
+ 上記のいずれも当てはまらない場合、関数は、頂点が最小境界ボックスの角であるcounter-clockwise-orientedゴンを返します。

空でないすべての入力に対して、この関数は入力ジオメトリの 2D 射影を処理します。

**[Syntax]** (構文)

```
ST_Envelope(geom)
```

**引数**
+ `geom` - データ型 GEOMETRY の値、または GEOMETRY 型に評価される式。

**戻り型**

GEOMETRY

geom が null の場合、null が返されます。

**例**

```
RETURN ST_Envelope(ST_GeomFromText("POLYGON ((2 1, 4 3, 6 1, 5 5, 3 4, 2 1))"))
POLYGON ((2 1, 6 1, 6 5, 2 5, 2 1))
```

# ST\$1Buffer
<a name="access-graph-opencypher-22-spatial-functions-st-buffer"></a>

ST\$1Buffer は、xy-デカルト平面に投影された入力ジオメトリからの距離が入力距離以下であるすべてのポイントを表す 2D ジオメトリを返します。

**[Syntax]** (構文)

```
ST_Buffer(geom, distance, number_of_segments_per_quarter_circle)
```

**引数**
+ `geom` - データ型 GEOMETRY の値、または GEOMETRY 型に評価される式。
+ `distance` - バッファの距離 (または半径) を表すデータ型 DOUBLE PRECISION の値。
+ `number_of_segments_per_quarter_circle` - データ型 INTEGER の値 (0 以上である必要があります）。この値は、入力ジオメトリの各頂点の周りの四分円を近似するためのポイントの数を決定します。負の値はデフォルトでゼロになります。デフォルトは 8 です。

**戻り型**

GEOMETRY

ST\$1Buffer 関数は、xy-デカルト平面内の 2 次元 (2D) ジオメトリを返します。

**例**

```
RETURN ST_Buffer(ST_GeomFromText('LINESTRING (1 2,5 2,5 8)'), 2, 4);
POLYGON ((3 4, 3 8, 3.1522409349774265 8.76536686473018,
         3.585786437626905 9.414213562373096, 4.234633135269821 9.847759065022574,
         5 10, 5.765366864730179 9.847759065022574,
         6.414213562373095 9.414213562373096, 6.847759065022574 8.76536686473018,
         7 8, 7 2, 6.847759065022574 1.2346331352698203,
         6.414213562373095 0.5857864376269051, 5.765366864730179 0.1522409349774265,
         5 0, 1 0, 0.2346331352698193 0.152240934977427,
         -0.4142135623730954 0.5857864376269051,
         -0.8477590650225737 1.2346331352698208, -1 2.0000000000000004,
         -0.8477590650225735 2.7653668647301797,
         -0.4142135623730949 3.414213562373095,
         0.2346331352698206 3.8477590650225735, 1 4, 3 4))
```

次は、円に近似する入力ポイントジオメトリのバッファを返します。このコマンドは四分円あたりのセグメント数として 3 を指定するため、関数は 3 つのセグメントを使用して四分円を近似します。

```
RETURN ST_Buffer(ST_GeomFromText('POINT (1 1)'), 1.0, 8));
POLYGON ((2 1, 1.9807852804032304 0.8049096779838718,
     1.9238795325112867 0.6173165676349102, 1.8314696123025453 0.4444297669803978,
     1.7071067811865475 0.2928932188134525, 1.5555702330196022 0.1685303876974548,
     1.3826834323650898 0.0761204674887133, 1.1950903220161284 0.0192147195967696,
     1 0, 0.8049096779838718 0.0192147195967696, 0.6173165676349103 0.0761204674887133,
    0.444429766980398 0.1685303876974545, 0.2928932188134525 0.2928932188134524,
     0.1685303876974546 0.4444297669803978, 0.0761204674887133 0.6173165676349102,
     0.0192147195967696 0.8049096779838714, 0 0.9999999999999999,
     0.0192147195967696 1.1950903220161284, 0.0761204674887132 1.3826834323650896,
     0.1685303876974545 1.555570233019602, 0.2928932188134523 1.7071067811865475,
     0.4444297669803978 1.8314696123025453, 0.6173165676349097 1.9238795325112865,
     0.8049096779838714 1.9807852804032304, 0.9999999999999998 2,
     1.1950903220161284 1.9807852804032304, 1.38268343236509 1.9238795325112865,
     1.5555702330196017 1.8314696123025453, 1.7071067811865475 1.7071067811865477,
     1.8314696123025453 1.5555702330196022, 1.9238795325112865 1.3826834323650905,
     1.9807852804032304 1.1950903220161286, 2 1))
```