2013-07-31 26 views
8

Tôi có một lớp và chỉ mục không gian được cấu hình đúng và có thể truy vấn thành công một nút bằng cách sử dụng lệnh gọi API findGeometriesWithinDistance REST.Truy vấn Cypher không gian trong "Neo" không gian trả về rỗng trong khi truy vấn REST trả về dữ liệu

POST /db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance {"layer":"geom","pointX":15.0,"pointY":60.0,"distanceInKm":100.0} 

Tuy nhiên, khi truy vấn sử dụng cypher, tôi không nhận được kết quả (Tôi đã cố gắng đảo ngược thứ tự của 60,0 và 15,0 mà không may mắn):

START n=node:geom('withinDistance:[60.0, 15.0, 500.0]') return n; 

Cyper trả:

==> +---+ 
==> | n | 
==> +---+ 
==> +---+ 
==> 0 row 
==> 
==> 13 ms 

REST:

200 OK 
==> [ { 
==> "paged_traverse" : "http://localhost:7474/db/data/node/14472/paged/traverse/{returnType}{?pageSize,leaseTime}", 
==> "outgoing_relationships" : "http://localhost:7474/db/data/node/14472/relationships/out", 
==> "data" : { 
==>  "lon" : 15.2, 
==>  "bbox" : [ 15.2, 60.1, 15.2, 60.1 ], 
==>  "RaceName" : "Parador Es Muy Caliente", 
==>  "lat" : 60.1, 
==>  "gtype" : 1 
==> }, 
==> "all_typed_relationships" : "http://localhost:7474/db/data/node/14472/relationships/all/{-list|&|types}", 
==> "traverse" : "http://localhost:7474/db/data/node/14472/traverse/{returnType}", 
==> "self" : "http://localhost:7474/db/data/node/14472", 
==> "all_relationships" : "http://localhost:7474/db/data/node/14472/relationships/all", 
==> "property" : "http://localhost:7474/db/data/node/14472/properties/{key}", 
==> "properties" : "http://localhost:7474/db/data/node/14472/properties", 
==> "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/14472/relationships/out/{-list|&|types}", 
==> "incoming_relationships" : "http://localhost:7474/db/data/node/14472/relationships/in", 
==> "incoming_typed_relationships" : "http://localhost:7474/db/data/node/14472/relationships/in/{-list|&|types}", 
==> "extensions" : { 
==> }, 
==> "create_relationship" : "http://localhost:7474/db/data/node/14472/relationships" 
==> } ] 

REST của cuộc gọi đến tái sản xuất: Create Layer:

POST /db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer { "layer":"geom", "lat":"lat", "lon":"lon" } 

Tạo Index:

POST /db/data/index/node/ {"name":"geom", "config":{"provider":"spatial", "geometry_type":"point","lat":"lat","lon":"lon"}} 

Tạo Node:

POST /db/data/node {"lat":60.2,"lon":15.1,"RaceName":"Parador Es Muy Caliente"} 

(Để đối phó, kiểm tra "tự" và tìm nodeID)

Lập chỉ mục nút:

POST /db/data/ext/SpatialPlugin/graphdb/addNodeToLayer {"layer":"geom", "node":"http://localhost:7474/db/data/node/###NEW_NODE_ID###"} 

Find:

POST /db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance {"layer":"geom","pointX":15.0,"pointY":60.0,"distanceInKm":100.0} 

Trả lời

3

đây là một lỗi, xin xem https://github.com/neo4j/spatial/issues/106 nếu bạn muốn, cảm thấy tự do để điều tra, dường như là lặp đi lặp lại trong SpatialRecordHits.java!

Trong khi đó, hãy đảm bảo thêm nút vào chỉ mục trước khi truy vấn thông qua chỉ mục, vì điều đó tạo cấu trúc nút thích hợp.

+1

Cảm ơn sự giúp đỡ của bạn Peter - như bạn đã chỉ ra trong email, giải pháp chính xác là thêm nút vào chỉ mục, thay vì chỉ là lớp: 'POST/db/data/index/node/geom {" value ":" dummy "," key ":" dummy "," uri ":" http: // localhost: 7474/db/data/node/1234 "}' Khi tôi đã làm điều đó, truy vấn Cypher hoạt động hoàn hảo: 'start n = node: Địa điểm ('withinDistance: [15.0, 60.0, 100.0]') return n;' Không chắc chắn làm thế nào tôi bỏ lỡ trong thử nghiệm, nhưng cảm ơn một lần nữa cho chỉ nó ra. –

+0

Troy, Sau khi thảo luận với Michael, bạn có thể tìm kiếm qua Cypher nếu bạn thêm nút đó vào INDEX, không chỉ cho lớp đó. Trong trường hợp đó, bạn sẽ có thể tìm thấy nút của bạn với Cypher vì có thông tin phù hợp được tạo trong quá trình lập chỉ mục. Chúng tôi đang dự tính thêm cấu hình chỉ mục bao gồm trường hợp sử dụng bạn hiện có, nhưng bạn sẽ ổn nếu bạn trước khi tìm kiếm Cypher của bạn thêm nút vào chỉ mục, xem https://github.com/neo4j/spatial/ blob/master/src/test/java/org/neo4j/gis/không gian/SpatialPluginFunctionalTest.java # L268 /peter –

+1

Peter - Một câu hỏi mà tôi có là tôi có thực sự cần thêm nút vào lớp hay không . Dường như truy vấn không gian hoạt động có hoặc không có bước đó. Bạn có thể cho tôi hay chỉ cho tôi bất kỳ thông tin chi tiết nào về điều đó không? Troy –

6

Tôi đã điều tra điều này và nó liên quan đến một vấn đề mà chúng tôi đã thấy một vài lần. Có một sự mâu thuẫn trong thiết kế của thư viện không gian trong đó có hai cách để thêm một nút vào chỉ mục không gian. Một là thêm nó vào Layer (sử dụng cuộc gọi REST addNodeToLayer), và điều này sử dụng Java API cơ bản, kết nối trực tiếp nút vào RTree như một phần của cùng một đồ thị. Cách khác là tạo nút proxy trong biểu đồ chỉ mục để biểu đồ miền của bạn không được kết nối với biểu đồ chỉ mục. Cách tiếp cận thứ hai này chỉ được thực hiện bởi giao diện IndexProvider (sử dụng lệnh gọi/db/data/index/node/geom REST).

Nếu bạn gọi cả hai phương pháp, nút được thêm hai lần, một lần trực tiếp và một lần bằng proxy. Vấn đề là truy vấn chỉ mục Cypher withinDistance chỉ truy cập vào giao diện IndexProvider và sẽ chỉ trả về các nút KHÔNG được kết nối với chỉ mục. Vì vậy, nếu bạn thêm nút theo cả hai cách, nó sẽ không được trả lại.

Vì vậy, bạn chỉ cần thêm nó theo một trong hai cách. Tôi đã không nhìn thấy trong email ban đầu của bạn bất kỳ đề cập đến addNodeToLayer, vì vậy tôi nghi ngờ rằng SDN có thể gọi addNodeToLayer (có lẽ Michael có thể bình luận), trong trường hợp này bạn không thể sử dụng cuộc gọi cypher.

Trong thử nghiệm của tôi, tôi đã có thể tự loại bỏ các mối quan hệ một chỉ số sử dụng Cypher như thế này:

BẮT ĐẦU n = nút (13065) MATCH (n) < - [r: RTREE_REFERENCE] -() DELETE r

Thay thế số 13065 bằng id nút của bạn cho nút gốc.

tôi đã làm như sau trong trình duyệt neo4j (trong 2.1.2):

:POST /db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer { "layer":"geom", "lat":"lat", "lon":"lon" } 
:POST /db/data/index/node/ {"name":"geom", "config":{"provider":"spatial", "geometry_type":"point","lat":"lat","lon":"lon"}} 
:POST /db/data/node {"lat":60.2,"lon":15.1,"RaceName":"Parador Es Muy Caliente"} 
:POST /db/data/index/node/geom {"value":"dummy","key":"dummy", "uri":"http://localhost:7474/db/data/node/13071"} 

này tạo ra một đồ thị với các nút không kết nối trực tiếp đến chỉ số. Trong trường hợp này, lệnh gọi REST 'findGeometriesWithinDistance' không hoạt động (sử dụng Java API chuẩn), trong khi cypher 'withinDistance' không hoạt động. Tôi đã thử nghiệm bằng lệnh này:

start n = node:geom("withinDistance:[60.2,15.1,100.0]") return n 

Lưu ý rằng không may API này đặt hàng là lat, lon, thay vì tiêu chuẩn lớn hơn, lat.

Sau đó, tôi cũng thêm vào lớp (tức là thêm trực tiếp vào đồ thị chỉ số.):

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

Bây giờ khi tôi tìm kiếm với lệnh cypher tôi vẫn nhận được câu trả lời đúng giống nhau, nhưng khi tôi tìm kiếm với lệnh REST:

:POST /db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance {"layer":"geom","pointX":15.0,"pointY":60.0,"distanceInKm":100.0} 

Tôi thấy điều này trả về nút proxy thay vì nút gốc.

+0

Điều đó giải thích lý do tại sao nó chỉ hoạt động sau khi khởi động lại cơ sở dữ liệu của tôi!Thật vậy, ban đầu, tôi đã không nhận thức được sự đảo ngược lat/lon trong việc sử dụng cypher, vì vậy tôi tự hỏi: "Nếu tôi thêm nút vào chỉ mục theo cách thủ công" => kết thúc bằng cả hai chỉ mục, ngăn chặn việc sử dụng tốt EVEN nếu tôi đã sử dụng withinDistance đúng cách. Sau khi khởi động lại, tôi giữ một chỉ mục (không làm gì cả) và gọi api theo cách tốt. Cảm ơn :) – Mik378

+0

Tôi vừa thử nghiệm cuộc gọi REST và trả về một số mục. Trong trường hợp của tôi, cả hai cách sử dụng (REST và Cypher) đều hoạt động out-of-box bằng SDN 3.1.2. Tôi thấy các liên kết đến RTREE_REFERENCE, nhưng không phải là các nút miền, chỉ các nút chứa thông tin 'wkt' và' id' của các nút miền thực. – Mik378

+1

Tôi đã thử nghiệm nhiều hơn một chút và nếu tôi gọi phương thức addNodeToLayer và phương thức index/node/geom theo một thứ tự khác, tôi nhận được các kết quả khác nhau. Nếu thêm vào chỉ mục trước, cả hai phương thức tìm kiếm sẽ hoạt động (mặc dù hàm findGeometriesWithinDistance trả về proxy). Nếu tôi thêm vào lớp đầu tiên, thì chỉ findGeometriesWithinDistance hoạt động. Tôi đã không điều tra thêm tại sao. Điều này vẫn hỗ trợ ý tưởng rằng tốt nhất là chỉ sử dụng một cách tiếp cận nhất quán. –

Các vấn đề liên quan