2016-06-15 6 views
2

neo4j 3.0.2 및 3.0.2 용 neo4j-spatial을 사용하여 공간 데이터베이스를 만들려고합니다. 나는 플러그인을 설치하고 난 플러그인이 다음에 출력하는 컬 curl -v http://neo4j:[email protected]:7474/db/data/으로 실행되고 있는지 확인했다 :Neo4j Spatial 3.0.2 : 'spatial'인덱스가 없습니다.

// define entity manager 
$client = $this->get('neo4j.spatial_manager')->getClient(); 



// 1. Create a pointlayer 
$request = $client->request('POST', 
    '/db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer', 
    [ 
     'json' => [ 
      'layer' => 'geom', 
      'lat' => 'lat', 
      'lon' => 'lon', 
     ], 
    ] 
); 

var_dump($request); 

이와 공간 루트 노드를 작성합니다

{ 
    "extensions" : { 
    "SpatialPlugin" : { 
     "addSimplePointLayer" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer", 
     "addNodesToLayer" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/addNodesToLayer", 
     "findClosestGeometries" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findClosestGeometries", 
     "addGeometryWKTToLayer" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/addGeometryWKTToLayer", 
     "findGeometriesWithinDistance" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance", 
     "addEditableLayer" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/addEditableLayer", 
     "addCQLDynamicLayer" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/addCQLDynamicLayer", 
     "addNodeToLayer" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/addNodeToLayer", 
     "getLayer" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/getLayer", 
     "findGeometriesInBBox" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findGeometriesInBBox", 
     "updateGeometryFromWKT" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/updateGeometryFromWKT", 
     "findGeometriesIntersectingBBox" : "http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findGeometriesIntersectingBBox" 
    } 
    }, 
    "node" : "http://localhost:7474/db/data/node", 
    "relationship" : "http://localhost:7474/db/data/relationship", 
    "node_index" : "http://localhost:7474/db/data/index/node", 
    "relationship_index" : "http://localhost:7474/db/data/index/relationship", 
    "extensions_info" : "http://localhost:7474/db/data/ext", 
    "relationship_types" : "http://localhost:7474/db/data/relationship/types", 
    "batch" : "http://localhost:7474/db/data/batch", 
    "cypher" : "http://localhost:7474/db/data/cypher", 
    "indexes" : "http://localhost:7474/db/data/schema/index", 
    "constraints" : "http://localhost:7474/db/data/schema/constraint", 
    "transaction" : "http://localhost:7474/db/data/transaction", 
    "node_labels" : "http://localhost:7474/db/data/labels", 
    "neo4j_version" : "3.0.2" 
* Connection #0 to host localhost left intact 
}* Closing connection #0 

지금 나는 새로운 simplePointLayer를 만들 수 있습니다 rTree. 그러나 지금은 다음과 같이 공간 인덱스를 만들 때

// 2. Create a spatial index 
$request = $client->request('POST', 
    '/db/data/index/node/', 
    [ 
     'json' => [ 
      'name' => 'geom', 
      'config' => [ 
       'provider' => 'spatial', 
       'geometry_type' => 'point', 
       'lat' => 'lat', 
       'lon' => 'lon', 
      ], 
     ], 
    ] 
); 

var_dump($request); 

나는 오류 메시지에 직면하고있다 : 내가 잘못 뭐하는 거지

"message" : "No index provider 'spatial' found. 

? 많은 포럼 등을 점검했지만 답은 항상 공간 플러그인을 설치하는 것으로 보입니다. 공간 플러그인은 첫 번째 출력에 따라 작동하는 것으로 보입니다.

// Create a node with spatial data 
    $json = [ 
     'team' => 'REDBLUE', 
     'name' => 'TEST', 
     'lat' => 25.121075, 
     'lon' => 89.990630, 
    ]; 
    $response = $client->request('POST', 
     '/db/data/node', 
     [ 
      'json' => $json 
     ] 
    ); 

    $node = json_decode($response->getBody(), true)['self']; 

    // Add the node to the layer 
    $response = $client->request('POST', 
     '/db/data/ext/SpatialPlugin/graphdb/addNodeToLayer', 
     [ 
      'json' => [ 
       'layer' => 'geom', 
       'node' => $node, 
      ], 
     ] 
    ); 

    $data = json_decode($response->getBody(), true); 

    var_dump($data); 

을 내가 REST를 통해 노드를 조회 할 수 있습니다 :

$request = $client->request('POST', 
     '/db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance', 
     [ 
      'json' => [ 
       'layer' => 'geom', 
       'pointX' => 89.99506, 
       'pointY' => 25.121260, 
       'distanceInKm' => 10, 
      ], 
     ] 
    ); 

$data = json_decode($request->getBody(), true); 

var_dump($data); 

그러나

편집 2016년 6월 15일는

무슨 이상한 것은 내가 RTREE에 노드를 추가 할 수 있다는 것입니다 왜 내가 색인을 만들지 못하게하는거야? 또는 자동으로 인덱싱을 수행합니까? 그렇다면 CYPHER (예 : 웹 콘솔)를 사용하여 어떻게 쿼리 할 수 ​​있습니까?

도움이 될 것입니다. 건배

답변

1

Spatial에 대한 사용자 정의 프로 시저를 위해 인덱스 공급자가 제거되었습니다 (당시에는 Cypher와의 통합을 제공하는 유일한 방법이었습니다).

볼이로 https://github.com/neo4j-contrib/spatial/blob/master/src/test/java/org/neo4j/gis/spatial/procedures/SpatialProceduresTest.java#L113

는 (3.0)의 새로운 주요 릴리스입니다 우리는 합리적인 인덱스 제공자를 제거 발견했다.

+1

중요한 정보를 제공해 주셔서 감사합니다. Cypher를 사용하여 공간 쿼리를 정확히 수행하려면 어떻게해야합니까? 'CALL spatial.withinDistance ('geom', {pointX : 89.99506, pointY : 25.121260}, 100)를 호출하면''spatial.withinDistance' 프로 시저를 호출하지 못했습니다 : 원인 : java.lang.NoClassDefFoundError : org/neo4j/cypher/internal/compiler/v3_0/commands/expressions/GeographicPoint' – Joran

+1

기본값을 사용하여 호출 명령으로 모든 것을 생성 할 때도 같은 오류가 발생합니다 :'CALL spatial.addPointLayer ('geom')' T.와 함께 match (t : {Tile {name : 'test', 위도 : 47.99, 경도 : 7.886})'및 마지막으로 :'match (t : Tile) spatial.addNode ('geom', t) YIELD 노드 반환 횟수 (*)'. 'CALL spatial.withinDistance ('geom', {위도 : 47.60, 경도 : 7.7}, 100) '을 사용하여 쿼리하면 동일한 오류가 나타납니다. – Joran