地理空間スキーマ
地理空間スキーマの作成方法。
地理空間形状を使用して検索できるデータは、point、linestring、polygonという、3つの地理空間データ型に格納されます。これらのデータ型のスキーマを作成したら、スキーマを使用して地理空間クエリーを構築できます。円またはポリゴン内の地理空間ポイント、ポイント、またはラインストリングを検索する大半の地理空間クエリーでは、DSE Searchインデックスも作成する必要があります。
以下の例では、graph.addVertex(…)
コマンドを使用して地理空間データが読み込まれますが、DSE Graph Loaderを使用してDSE 5.0.9およびDSE 5.1.2から地理空間データを読み込むことができます。
手順
ポイント・スキーマ
-
ポイントのスキーマを作成し、ポイントのプロパティ値で頂点を追加します。
pointプロパティを持つlocationの頂点ラベルが作成されます。schema.propertyKey('name').Text().create() schema.propertyKey('point').Point().withGeoBounds().create() schema.vertexLabel('location').properties('name','point').create() graph.addVertex(label, 'location', 'name', 'Paris', 'point', Geo.point(2.352222, 48.856614))
注: 地理空間ラインストリングでは、地理空間ポイントと同様に、withGeoBounds()
メソッドによって緯度が-90度から+90度まで(南極から北極まで)のデフォルトの有効範囲と経度が-180度から+180度まで(グリニッジ子午線の東から西まで)の有効範囲に検索が制限されます。ポイントの指定にはGeo.point(longitude, latitude)
が使用され、ポイントを追加するときにWellKnownText(WKT)形式で行われます。経度、緯度の順に指定されることに注意してください。ポイントが存在することを確認します。g.V().has('location', 'name', 'Paris').valueMap() ==>{name=[Paris], point=[POINT (2.352222 48.856614)]}
ラインストリング・スキーマ
-
ラインストリングのスキーマを作成し、ラインストリングのプロパティ値で頂点を追加します。
LineStringプロパティを持つlineLocationの頂点ラベルが作成されます。ポイントに適用されたのと同じ範囲制限がラインストリングにも適用されます。schema.propertyKey('name').Text().create() schema.propertyKey('line').Linestring().withGeoBounds().create() schema.vertexLabel('lineLocation').properties('name','line').create() graph.addVertex(label, 'lineLocation', 'name', 'ParisLondon', 'line', "LINESTRING(2.352222 48.856614, -0.127758 51.507351)")
ラインストリングが存在することを確認します。g.V().has('lineLocation','name','ParisLondon').valueMap() ==>{line=[LINESTRING (2.352222 48.856614, -0.127758 51.507351)], name=[ParisLondon]}
ポリゴン・スキーマ
-
ポリゴンのスキーマを作成し、ポリゴンのプロパティ値で頂点を追加します。
Polygonプロパティを持つpolyLocationの頂点ラベルが作成されます。ポイントに適用されたのと同じ範囲制限がポリゴンにも適用されます。schema.propertyKey('name').Text().create() schema.propertyKey('polygon').Polygon().withGeoBounds().create() schema.vertexLabel('polyLocation').properties('name','polygon').create() graph.addVertex(label, 'polyLocation','name', 'ParisLondonDublin', 'polygon',Geo.polygon(2.352222, 48.856614, -0.127758, 51.507351, -6.26031, 53.349805))
ポリゴンが存在することを確認します。g.V().has('polyLocation','name','ParisLondonDublin').valueMap() ==>{polygon=[POLYGON ((2.352222 48.856614, -0.127758 51.507351, -6.26031 53.349805, 2.352222 48.856614))], name=[ParisLondonDublin]}
DSE Searchインデックス
-
DSE Graphは地理空間検索をネイティブでサポートしますが、検索インデックスなしの地理空間検索は、グラフに含まれる頂点の数の増加に応じて拡張しません。検索インデックスを使用せずにこのようなクエリーを行うと、フルスキャンが必要となるため、クエリー・パフォーマンスがひどく低下します。DSE Searchインデックスは、ポイントとラインストリングのインデックスを作成できますが、ポリゴンのインデックスを作成できません。
//SEARCH INDEX ONLY WORKS FOR POINT AND LINESTRING schema.vertexLabel('location').index('search').search().by('point').add() schema.vertexLabel('lineLocation').index('search').search().by('line').add()
空間クエリーでは、検索インデックスがなくても常に正確な結果が返されます。ところが、DSE Searchインデックスの場合は、正確さと引き換えにパフォーマンスが犠牲になることがあります。注: DSE Searchインデックスの有無にかかわらず、同じ地理空間クエリーが実行された場合に混乱が生じる可能性があります。地理空間クエリーでは、検索インデックスがなくても常に正確な結果が返されます。ところが、DSE Searchインデックスの場合は、maxDistErr(デフォルト:0.000009)
とdistErrPct(デフォルト:0.025)
という2つの調整可能パラメーターを使用して、クエリーの正確さと引き換えに、書き込みパフォーマンスとインデックス・サイズが犠牲になります。これらの2つの例で結果が一致していないのは、パラメーターのデフォルト値の距離計算アルゴリズムにばらつきがあるためです。DSE Graphは、検索インデックスの作成時にこれら2つのパラメーターの値を渡すことができます。withError(maxDistErr, distErrPct)
でmaxDistErr
を「0.0
」に変更して、インデックス・ベース・クエリーと非インデックス・ベース・クエリーの両方で同じ値が生成されるようにします。schema.vertexLabel('location').index('search').search().by('point').withError(0.000009,0.0).add()