Very well explained, thanks, However, one problem with one layer solution is that when I am trying Q2 and Q3 it returns also non-point nodes (edge and polygons) which are not part of the result. So I think it might be better for me to have two layers. Is there any performance cost on having several layers?
Using the two layer approach for query Q2 and Q3 I am not getting the desired results. For instance for query Q2: Node s = dbInstance.findNode(dbLabel, "cid", Integer.parseInt(cellId)); Geometry geometry = layer.getGeometryEncoder().decodeGeometry(s); List<SpatialDatabaseRecord> snodes = GeoPipeline. startNearestNeighborLatLonSearch(layer, geometry.getCoordinate(), 1.0).toSpatialDatabaseRecordList(); where the coordinates of node s are (0.0, 0.0). It returns only the node itself. Looking at the source, it seems startNearestNeighborLatLonSearch builds a window which is much more smaller. Should I build my own window and pass to startNearestNeighborLatLonSearch instead of last param ? Similar problem with startNearestNeighborSearch when looking for K neighbors. Cheers, Thanks, Alireza On Wednesday, August 12, 2015 at 4:36:35 PM UTC+2, Craig Taverner wrote: > > Hi Alireza, > > Since you have three different geometry types, you are correct to use WKT > (or WKB) for the layer. This layer can handle all three types. You do not > need a separate layer for points. The only reason I suggested making a > points-only layer was that I thought perhaps you only stored points. But > since you store all types, rather have a layer that can handle all. > > The code you have above looks fine and similar to the test code I made. So > it should work fine. The error you had earlier looked like you had tried to > manually create node geometries and add the nodes to the layer, instead of > adding the geometry to the layer. > > One thing I find a little strange above is that you have chosen to use an > encoder config with three fields "x:y:z". But the WKB and WKT encoders only > understand two. The first is the geometry property name (you chose "x" to > hold the geometry in the node), and the second is the bbox property. I > think it a little confusing to store a whole polygon in "x" and to store > the envelope(bbox) in "y". I'm guessing this is not what you intended to > do? I advise you rather pass a single string with no ':' separators, like > 'my_geom'. Better yet, leave it empty and get the default value. In fact > you can leave off all fields but the layer name, if you use the method > getOrCreateEditableLayer(name). > > Here is a section of the test code I tried, which worked, and adds a Point > and LineString to the layer: > > SpatialDatabaseService db = new SpatialDatabaseService( graphDb() ); > String layerName = "myLayer"; > String geomPropertyName = "my_geom"; > EditableLayer layer = (EditableLayer) db.getOrCreateLayer( layerName, > WKBGeometryEncoder.class, > EditableLayerImpl.class, > geomPropertyName ); > GeometryFactory gf = layer.getGeometryFactory(); > SpatialDatabaseRecord record = layer.add( gf.createPoint( new Coordinate( > 15.25, 56.15 ) ) ); > LinearRing ring = gf.createLinearRing( new Coordinate[]{ > new Coordinate( 15.3, 56.2 ), > new Coordinate( 15.4, 56.2 ), > new Coordinate( 15.4, 56.3 ), > new Coordinate( 15.3, 56.3 ), > new Coordinate( 15.3, 56.2 ) > } ); > Polygon polygon = gf.createPolygon( ring, null ); > record = layer.add( polygon ); > > You can use WKB or WKT for this layer. Note that if you created a layer > with simply: > > db.getOrCreateEditableLayer( layerName ); > > Then you get a WKB layer with default configs. > > Regards, Craig > > > On Wed, Aug 12, 2015 at 4:01 PM, Alireza Rezaei Mahdiraji < > alire...@gmail.com <javascript:>> wrote: > >> >> Hi Craig, >> >> As always thanks for your nice reply. >> >> I understood the problem but not the solution yet. The fact is I have >> points, lines, and polygons as geometries. >> Four main queries which I have are as follows: >> >> 1- given coordinates of an arbitrary point (i.e., not a node in the >> graph) find the polygon node which enclose it >> >> 2- given a point node find all other nodes which are withing distance r >> of it. >> >> 3- given a point node find all k nearest neighbors point node of it >> >> 4- given two polygon determines if they intersect and perhaps find the >> size of intersection >> >> I defined my layer as follows (I tried with WKB too): >> >> EditableLayer runningLayer = (EditableLayer) >> graphDBSpatial.getOrCreateLayer(layerName, >> WKTGeometryEncoder.class, >> EditableLayerImpl.class, >> "x:y:z"); >> >> Then I create my nodes as follows: >> >> // point node >> Point p = runningLayer.getGeometryFactory().createPoint(coord); >> SpatialDatabaseRecord v = runningLayer.add(p); >> >> // edge node >> LineString lineString = >> runningLayer.getGeometryFactory().createLineString(coord); >> SpatialDatabaseRecord e = runningLayer.add(lineString); >> >> // polygon node >> Polygon poly = >> runningLayer.getGeometryFactory().createPolygon(coordinates); >> SpatialDatabaseRecord tc = runningLayer.add(poly); >> >> Based on what you said I should have a separate layer for point, right? >> If the answer is yes, then while querying I should load two layers >> based on which of the queries above is requested (WKT layer for queries 1 >> and 4 and Point layer for 2 and 3), is that correct ? >> >> Cheers, >> Alireza >> >> On Monday, August 10, 2015 at 11:09:21 AM UTC+2, Craig Taverner wrote: >>> >>> Hi Alireza, >>> >>> I wrote some test code using your layer creation and neighbour search >>> code that you pasted, and it works fine. So what I think has happened is >>> that you have somehow added nodes with a different layer config to the same >>> index that you are now using for WKB. Perhaps the nodes used to be points >>> in a simple point layer, and now you changed to a WKB layer, it is no >>> longer compatible. >>> >>> I can make a few suggestions: >>> >>> - Make sure your nodes were added using the layer.add(Geometry) >>> method. If you used layer.add(Node) then it is your responsibility to >>> make >>> sure the node conforms to the same layer config that you are planning to >>> use. For example, do not add a simple point node (with lat/lon >>> attributes) >>> to a WKT layer, or you are likely to create this kind of issue. >>> - Since you are working with points, can I suggest you not use the >>> WKB layer config, but rather use the SimplePointLayer, as created by >>> SpatialGraphDatabase.createSimplePointLayer(name) >>> or SpatialGraphDatabase.createSimplePointLayer(name,xProp,yProp) >>> >>> Regards, Craig >>> >>> On Sun, Aug 9, 2015 at 12:02 AM, Alireza Rezaei Mahdiraji < >>> alire...@gmail.com> wrote: >>> >>>> >>>> Let me ask you a design kind of question: the nodes in my graph could >>>> have various geometry: point, line, or polygon. >>>> I used the following layer definition (but I am not sure that is the >>>> best way to do it)" >>>> >>>> EditableLayer runningLayer = (EditableLayer) >>>> graphDBSpatial.getOrCreateLayer(layerName, >>>> WKBGeometryEncoder.class, >>>> EditableLayerImpl.class, >>>> geomEncoderConfig); >>>> >>>> I appreciate if you comment on this. >>>> >>>> Alireza >>>> >>>> >>>> On Saturday, August 8, 2015 at 11:48:24 PM UTC+2, Michael Hunger wrote: >>>>> >>>>> It seems you created the layer with a WKB (well known binary) >>>>> representation config >>>>> >>>>> but now your location properties are not decodable as WKB because they >>>>> are double's ? >>>>> >>>>> Michael >>>>> >>>>> Perhaps you can share a test that reproduces the issue? >>>>> >>>>> Am 08.08.2015 um 23:26 schrieb Alireza Rezaei Mahdiraji < >>>>> alire...@gmail.com>: >>>>> >>>>> >>>>> Here are the stacks for the two cases (very similar): >>>>> >>>>> Exception in thread "main" java.lang.ClassCastException: >>>>> java.lang.Double cannot be cast to [B >>>>> at >>>>> org.neo4j.gis.spatial.WKBGeometryEncoder.decodeGeometry(WKBGeometryEncoder.java:41) >>>>> at >>>>> org.neo4j.gis.spatial.filter.SearchIntersectWindow.onEnvelopeIntersection(SearchIntersectWindow.java:48) >>>>> at >>>>> org.neo4j.gis.spatial.rtree.filter.AbstractSearchEnvelopeIntersection.geometryMatches(AbstractSearchEnvelopeIntersection.java:45) >>>>> at >>>>> org.neo4j.gis.spatial.rtree.RTreeIndex$SearchEvaluator.checkPosition(RTreeIndex.java:286) >>>>> at >>>>> org.neo4j.gis.spatial.rtree.RTreeIndex$SearchEvaluator.isStopNode(RTreeIndex.java:299) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.OldTraverserWrapper$Pruner.evaluate(OldTraverserWrapper.java:260) >>>>> at >>>>> org.neo4j.graphdb.traversal.Evaluator$AsPathEvaluator.evaluate(Evaluator.java:69) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.MultiEvaluator.evaluate(MultiEvaluator.java:62) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.MonoDirectionalTraverserIterator.evaluate(MonoDirectionalTraverserIterator.java:61) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.TraversalBranchImpl.evaluate(TraversalBranchImpl.java:125) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.TraversalBranchImpl.initialize(TraversalBranchImpl.java:130) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.TraversalBranchImpl.next(TraversalBranchImpl.java:151) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.TraversalBranchWithState.next(TraversalBranchWithState.java:32) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.StartNodeTraversalBranch.next(StartNodeTraversalBranch.java:50) >>>>> at >>>>> org.neo4j.graphdb.traversal.PreorderDepthFirstSelector.next(PreorderDepthFirstSelector.java:49) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.MonoDirectionalTraverserIterator.fetchNextOrNull(MonoDirectionalTraverserIterator.java:70) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.MonoDirectionalTraverserIterator.fetchNextOrNull(MonoDirectionalTraverserIterator.java:36) >>>>> at >>>>> org.neo4j.helpers.collection.PrefetchingIterator.peek(PrefetchingIterator.java:60) >>>>> at >>>>> org.neo4j.helpers.collection.PrefetchingIterator.hasNext(PrefetchingIterator.java:46) >>>>> at >>>>> org.neo4j.helpers.collection.PrefetchingIterator.next(PrefetchingIterator.java:75) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.OldTraverserWrapper$TraverserImpl.next(OldTraverserWrapper.java:86) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.OldTraverserWrapper$TraverserImpl.next(OldTraverserWrapper.java:47) >>>>> at >>>>> org.neo4j.gis.spatial.filter.SearchRecords.next(SearchRecords.java:53) >>>>> at >>>>> org.neo4j.gis.spatial.filter.SearchRecords.next(SearchRecords.java:29) >>>>> at >>>>> org.neo4j.gis.spatial.pipes.GeoPipeline$1.next(GeoPipeline.java:134) >>>>> at >>>>> org.neo4j.gis.spatial.pipes.GeoPipeline$1.next(GeoPipeline.java:126) >>>>> at >>>>> org.neo4j.gis.spatial.pipes.impl.LastElementIterator.next(LastElementIterator.java:19) >>>>> at >>>>> org.neo4j.gis.spatial.pipes.impl.IdentityPipe.processNextStart(IdentityPipe.java:18) >>>>> at >>>>> org.neo4j.gis.spatial.pipes.impl.AbstractPipe.next(AbstractPipe.java:72) >>>>> at >>>>> org.neo4j.gis.spatial.pipes.AbstractGeoPipe.processNextStart(AbstractGeoPipe.java:49) >>>>> at >>>>> org.neo4j.gis.spatial.pipes.AbstractGeoPipe.processNextStart(AbstractGeoPipe.java:31) >>>>> at >>>>> org.neo4j.gis.spatial.pipes.impl.AbstractPipe.next(AbstractPipe.java:72) >>>>> at >>>>> org.neo4j.gis.spatial.pipes.impl.Pipeline.next(Pipeline.java:113) >>>>> at >>>>> org.neo4j.gis.spatial.pipes.GeoPipeline.toNodeList(GeoPipeline.java:1015) >>>>> >>>>> >>>>> Exception in thread "main" java.lang.ClassCastException: >>>>> java.lang.Double cannot be cast to [B >>>>> at >>>>> org.neo4j.gis.spatial.WKBGeometryEncoder.decodeGeometry(WKBGeometryEncoder.java:41) >>>>> at >>>>> org.neo4j.gis.spatial.filter.SearchIntersectWindow.onEnvelopeIntersection(SearchIntersectWindow.java:48) >>>>> at >>>>> org.neo4j.gis.spatial.rtree.filter.AbstractSearchEnvelopeIntersection.geometryMatches(AbstractSearchEnvelopeIntersection.java:45) >>>>> at >>>>> org.neo4j.gis.spatial.rtree.RTreeIndex$SearchEvaluator.checkPosition(RTreeIndex.java:286) >>>>> at >>>>> org.neo4j.gis.spatial.rtree.RTreeIndex$SearchEvaluator.isStopNode(RTreeIndex.java:299) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.OldTraverserWrapper$Pruner.evaluate(OldTraverserWrapper.java:260) >>>>> at >>>>> org.neo4j.graphdb.traversal.Evaluator$AsPathEvaluator.evaluate(Evaluator.java:69) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.MultiEvaluator.evaluate(MultiEvaluator.java:62) >>>>> at >>>>> org.neo4j.kernel.impl.traversal.MonoDirectionalTraverserIterator.evaluate(MonoDirectionalTraverserIterator.ja >>>>> >>>>> ... >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Neo4j" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to neo4j+un...@googlegroups.com. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "Neo4j" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to neo4j+un...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "Neo4j" group. To unsubscribe from this group and stop receiving emails from it, send an email to neo4j+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.