3

特定の GPS 位置を含む行政区域の名前を返すことができる Web サービスを開発しようとしています。

空間プラグインと Java API を使用して、neo4j にいくつかのポリゴン (私の国の行政区域) を挿入できる Java アプリケーションを既に開発しました。次に、GPS 位置を指定すると、それを含むポリゴンの名前を取得できます。

今、Neo4j の REST API (Java API の代わりに) を使用して同じことをしようとしていますが、例を見つけることができません。

だから私の質問は:

1) REST API を使用して Neo4j にポリゴンを挿入することは可能ですか?

2) 特定の GPS 位置を含むすべてのポリゴンを検​​索する空間クエリを実行できますか?

ありがとう、エンリコ

4

1 に答える 1

5

あなたの両方の質問に対する答えはイエスです。REST と Cypher を使用する手順の例を次に示します。

1) 空間レイヤーとインデックス (REST) を作成します。この例では、インデックスに「test」という名前を付け (同じ名前のレイヤーと基本空間ノードが作成されます)、wkt ジオメトリ情報を含むノードのプロパティの名前は「wkt」です。

POST http://localhost:7474/db/data/index/node {"name":"test", "config":{"provider":"spatial", "wkt":"wkt"}}

2) ノード (Cypher) を作成します。ラベルとさまざまなプロパティを持つことができます。Neo4j Spatial が気にする唯一の部分は「wkt」プロパティです。(このステップは REST で実行できます。)

CREATE (n { name : "Fooville", wkt : "POLYGON((11.0 11.0, 11.0 12.0, 12.0 12.0, 12.0 11.0, 11.0 11.0))" })

3) ノードをレイヤーに追加します。ノードをインデックスまたはレイヤーに追加することでこれを行うことができますが、重要な違いがあります。インデックスに追加すると、ジオメトリ データのみを含むコピー ノードが作成され、レイヤーに追加されます。Cypher を介してクエリを実行すると元のノードが返されますが、REST または Java を介してクエリを実行するとコピー ノードが返されます。ノードをレイヤーに直接追加する場合、後で Cypher を使用してクエリできるようにするには、追加の手順を実行する必要があります。どちらの場合も、ノードの URI が必要です。最後の要素は Neo4j ノード番号です。以下の例では、ノード番号が 4 であると想定しています (この例を新しい空のデータベースで実行すると、4 になります)。

方法 1:

POST http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/addNodeToLayer { "layer":"test", "node":"http://localhost:7474/db/data/node/4" }

このノードを Cypher で検索できるようにするには、ノード番号をユーザーの「id」プロパティとしてノードに追加します。(これは REST で行うことができます。)

START n = node(4) SET n.id = id(n)

方法 2: この方法を使用すると、ノード数が 2 倍になり、WKT ストレージが 2 倍になり、REST と Cypher を介してクエリを実行したときに異なる結果が生成されます。

POST http://localhost:7474/db/data/index/node/test {"value":"dummy","key":"dummy","uri":"http://localhost:7474/db/data/node/4"}

3) クエリを実行します。REST または Cypher でクエリを実行できます (上記のようにノードを調整したと仮定します)。使用可能な Cypher クエリは、「withinDistance」、「withinWKTGeometry」、および「bbox」です。使用可能な REST クエリは、「findGeometriesWithinDistance」、「findClosestGeometries」、および「findGeometriesInBBox」です。WKT ジオメトリ内のノードをクエリできるのは Cypher のみであることに注意してください。引数は同じですが、findClosestGeometries と findGeometriesWithinDistance の間にも REST の違いがあります。REST 呼び出しを行う方法を確認するには、次のコマンドを発行します。

POST http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance
POST http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findClosestGeometries
POST http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findGeometriesInBBox

Cypher クエリは次のとおりです: (「<>」を含む「<>」の間のテキストを実際の値に置き換えます)

START n = node:<layer>("withinDistance:[<y>, <x>, <max distance in km>]")
START n = node:<layer>("withinWKTGeometry:POLYGON((<x1> <y1>, ..., <xN> <yN>, <x1> <y1>))")
START n = node:<layer>("bbox:[<min x>, <max x>, <min y>, <max y>]")

このすべてにおいて、経度/緯度の座標参照系 (CRS) を使用していると想定しているため、x は経度で y は緯度です。(これにより、z が上である右手座標系が保持されます。)

于 2014-07-14T17:01:14.330 に答える